carlin 1.19.11 → 1.19.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/cli.js +232 -0
  2. package/dist/config.js +10 -0
  3. package/dist/deploy/addDefaults.cloudFormation.js +138 -0
  4. package/dist/deploy/baseStack/command.js +9 -0
  5. package/dist/deploy/baseStack/config.js +30 -0
  6. package/dist/deploy/baseStack/deployBaseStack.js +59 -0
  7. package/dist/deploy/baseStack/getBaseStackResource.js +26 -0
  8. package/dist/deploy/baseStack/getBucket.template.js +44 -0
  9. package/dist/deploy/baseStack/getLambdaImageBuilder.template.js +186 -0
  10. package/dist/deploy/baseStack/getLambdaLayerBuilder.template.js +140 -0
  11. package/dist/deploy/baseStack/getVpc.template.js +169 -0
  12. package/dist/deploy/cicd/cicd.template.js +922 -0
  13. package/dist/deploy/cicd/command.js +27 -0
  14. package/dist/deploy/cicd/command.options.js +71 -0
  15. package/dist/deploy/cicd/config.js +8 -0
  16. package/dist/deploy/cicd/deployCicd.js +93 -0
  17. package/dist/deploy/cicd/ecsTaskReportCommand.js +51 -0
  18. package/dist/deploy/cicd/getCicdStackName.js +11 -0
  19. package/dist/deploy/cicd/getTriggerPipelineObjectKey.js +11 -0
  20. package/dist/deploy/cicd/lambdas/cicdApiV1.handler.js +124 -0
  21. package/dist/deploy/cicd/lambdas/ecsTaskReport.handler.js +126 -0
  22. package/dist/deploy/cicd/lambdas/executeTasks.js +67 -0
  23. package/dist/deploy/cicd/lambdas/getProcessEnvVariable.js +10 -0
  24. package/dist/deploy/cicd/lambdas/githubWebhooksApiV1.handler.js +146 -0
  25. package/dist/deploy/cicd/lambdas/imageUpdaterSchedule.handler.js +44 -0
  26. package/dist/deploy/cicd/lambdas/index.js +13 -0
  27. package/dist/deploy/cicd/lambdas/pipelines.handler.js +134 -0
  28. package/dist/deploy/cicd/lambdas/putApprovalResultManualTask.js +52 -0
  29. package/dist/deploy/cicd/lambdas/shConditionalCommands.js +30 -0
  30. package/dist/deploy/cicd/pipelines.js +76 -0
  31. package/dist/deploy/cicd/readSSHKey.js +10 -0
  32. package/dist/deploy/cloudFormation.core.js +300 -0
  33. package/dist/deploy/cloudFormation.js +182 -0
  34. package/dist/deploy/command.js +185 -0
  35. package/dist/deploy/lambda/buildLambdaSingleFile.js +30 -0
  36. package/dist/deploy/lambda/deployLambdaCode.js +41 -0
  37. package/dist/deploy/lambda/deployLambdaLayers.js +34 -0
  38. package/dist/deploy/lambda/uploadCodeToECR.js +53 -0
  39. package/dist/deploy/lambda/uploadCodeToS3.js +31 -0
  40. package/dist/deploy/lambdaLayer/command.js +48 -0
  41. package/dist/deploy/lambdaLayer/deployLambdaLayer.js +140 -0
  42. package/dist/deploy/readDockerfile.js +18 -0
  43. package/dist/deploy/s3.js +165 -0
  44. package/dist/deploy/stackName.js +78 -0
  45. package/dist/deploy/staticApp/command.js +79 -0
  46. package/dist/deploy/staticApp/deployStaticApp.js +64 -0
  47. package/dist/deploy/staticApp/findDefaultBuildFolder.js +27 -0
  48. package/dist/deploy/staticApp/getOriginShieldRegion.js +30 -0
  49. package/dist/deploy/staticApp/getStaticAppBucket.js +19 -0
  50. package/dist/deploy/staticApp/invalidateCloudFront.js +42 -0
  51. package/dist/deploy/staticApp/removeOldVersions.js +43 -0
  52. package/dist/deploy/staticApp/staticApp.template.js +303 -0
  53. package/dist/deploy/staticApp/uploadBuiltAppToS3.js +27 -0
  54. package/dist/deploy/utils.js +29 -0
  55. package/dist/generateEnv/generateEnv.js +46 -0
  56. package/dist/generateEnv/generateEnvCommand.js +9 -0
  57. package/dist/index.js +5 -0
  58. package/dist/utils/addGroupToOptions.js +11 -0
  59. package/dist/utils/cloudFormationTemplate.js +132 -0
  60. package/dist/utils/codeBuild.js +50 -0
  61. package/dist/utils/environmentVariables.js +11 -0
  62. package/dist/utils/exec.js +22 -0
  63. package/dist/utils/formatCode.js +12 -0
  64. package/dist/utils/getAwsAccountId.js +10 -0
  65. package/dist/utils/getCurrentBranch.js +33 -0
  66. package/dist/utils/getEnvironment.js +6 -0
  67. package/dist/utils/getIamPath.js +6 -0
  68. package/dist/utils/getProjectName.js +35 -0
  69. package/dist/utils/index.js +17 -0
  70. package/dist/utils/packageJson.js +25 -0
  71. package/dist/utils/readCloudFormationTemplate.js +33 -0
  72. package/dist/utils/readObjectFile.js +46 -0
  73. package/package.json +3 -3
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLambdaImageBuilderTemplate = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
6
+ const utils_1 = require("../../utils");
7
+ const config_1 = require("./config");
8
+ const getLambdaImageBuilderTemplate = () => {
9
+ const CODE_BUILD_PROJECT_LOGS_LOGICAL_ID = 'CodeBuildProjectLogsLogGroup';
10
+ const CODE_BUILD_PROJECT_SERVICE_ROLE_LOGICAL_ID = 'ImageCodeBuildProjectIAMRole';
11
+ return {
12
+ AWSTemplateFormatVersion: '2010-09-09',
13
+ Resources: {
14
+ [CODE_BUILD_PROJECT_LOGS_LOGICAL_ID]: {
15
+ Type: 'AWS::Logs::LogGroup',
16
+ DeletionPolicy: 'Delete',
17
+ Properties: {},
18
+ },
19
+ [CODE_BUILD_PROJECT_SERVICE_ROLE_LOGICAL_ID]: {
20
+ Type: 'AWS::IAM::Role',
21
+ Properties: {
22
+ AssumeRolePolicyDocument: {
23
+ Version: '2012-10-17',
24
+ Statement: [
25
+ {
26
+ Effect: 'Allow',
27
+ Principal: {
28
+ Service: 'codebuild.amazonaws.com',
29
+ },
30
+ Action: 'sts:AssumeRole',
31
+ },
32
+ ],
33
+ },
34
+ Path: (0, utils_1.getIamPath)(),
35
+ Policies: [
36
+ {
37
+ PolicyName: `${CODE_BUILD_PROJECT_SERVICE_ROLE_LOGICAL_ID}Policy`,
38
+ PolicyDocument: {
39
+ Version: '2012-10-17',
40
+ Statement: [
41
+ {
42
+ Effect: 'Allow',
43
+ Action: ['logs:CreateLogStream', 'logs:PutLogEvents'],
44
+ Resource: '*',
45
+ },
46
+ {
47
+ Effect: 'Allow',
48
+ Action: ['ecr:GetAuthorizationToken'],
49
+ Resource: '*',
50
+ },
51
+ {
52
+ Effect: 'Allow',
53
+ Action: [
54
+ 'ecr:BatchCheckLayerAvailability',
55
+ 'ecr:CompleteLayerUpload',
56
+ 'ecr:InitiateLayerUpload',
57
+ 'ecr:PutImage',
58
+ 'ecr:UploadLayerPart',
59
+ ],
60
+ Resource: '*',
61
+ },
62
+ {
63
+ Effect: 'Allow',
64
+ Action: 's3:GetObject',
65
+ Resource: [
66
+ {
67
+ 'Fn::Sub': [
68
+ // eslint-disable-next-line no-template-curly-in-string
69
+ 'arn:aws:s3:::${BucketName}/*',
70
+ {
71
+ BucketName: {
72
+ Ref: config_1.BASE_STACK_BUCKET_LOGICAL_NAME,
73
+ },
74
+ },
75
+ ],
76
+ },
77
+ ],
78
+ },
79
+ ],
80
+ },
81
+ },
82
+ ],
83
+ },
84
+ },
85
+ [config_1.BASE_STACK_LAMBDA_IMAGE_BUILDER_LOGICAL_NAME]: {
86
+ Type: 'AWS::CodeBuild::Project',
87
+ Properties: {
88
+ Artifacts: {
89
+ Type: 'NO_ARTIFACTS',
90
+ },
91
+ Cache: {
92
+ Location: 'LOCAL',
93
+ Modes: ['LOCAL_DOCKER_LAYER_CACHE'],
94
+ Type: 'LOCAL',
95
+ },
96
+ Description: 'Create Lambda image.',
97
+ Environment: {
98
+ ComputeType: 'BUILD_GENERAL1_SMALL',
99
+ EnvironmentVariables: [
100
+ {
101
+ Name: 'AWS_ACCOUNT_ID',
102
+ Value: { Ref: 'AWS::AccountId' },
103
+ },
104
+ {
105
+ Name: 'AWS_REGION',
106
+ Value: { Ref: 'AWS::Region' },
107
+ },
108
+ {
109
+ Name: 'IMAGE_TAG',
110
+ Value: 'latest',
111
+ },
112
+ {
113
+ Name: 'LAMBDA_EXTERNALS',
114
+ Value: '',
115
+ },
116
+ ],
117
+ Image: 'aws/codebuild/standard:3.0',
118
+ ImagePullCredentialsType: 'CODEBUILD',
119
+ PrivilegedMode: true,
120
+ Type: 'LINUX_CONTAINER',
121
+ },
122
+ LogsConfig: {
123
+ CloudWatchLogs: {
124
+ Status: 'ENABLED',
125
+ GroupName: { Ref: CODE_BUILD_PROJECT_LOGS_LOGICAL_ID },
126
+ },
127
+ },
128
+ ServiceRole: {
129
+ 'Fn::GetAtt': [CODE_BUILD_PROJECT_SERVICE_ROLE_LOGICAL_ID, 'Arn'],
130
+ },
131
+ Source: {
132
+ BuildSpec: js_yaml_1.default.dump({
133
+ version: '0.2',
134
+ phases: {
135
+ install: {
136
+ commands: [
137
+ 'echo install started on `date`',
138
+ 'npm init -y',
139
+ /**
140
+ * https://stackoverflow.com/a/51433146/8786986
141
+ */
142
+ 'npm install --save --package-lock-only --no-package-lock $LAMBDA_EXTERNALS',
143
+ 'ls',
144
+ ],
145
+ },
146
+ pre_build: {
147
+ commands: [
148
+ 'echo pre_build started on `date`',
149
+ '$(aws ecr get-login --no-include-email --region $AWS_REGION)',
150
+ ],
151
+ },
152
+ build: {
153
+ commands: [
154
+ 'echo build started on `date`',
155
+ 'echo Building the repository image...',
156
+ 'echo "$DOCKERFILE" > Dockerfile',
157
+ 'docker build -t $REPOSITORY_ECR_REPOSITORY:$IMAGE_TAG -f Dockerfile .',
158
+ 'docker tag $REPOSITORY_ECR_REPOSITORY:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPOSITORY_ECR_REPOSITORY:$IMAGE_TAG',
159
+ ],
160
+ },
161
+ post_build: {
162
+ commands: [
163
+ 'echo post_build completed on `date`',
164
+ 'echo Pushing the repository image...',
165
+ 'docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$REPOSITORY_ECR_REPOSITORY:$IMAGE_TAG',
166
+ ],
167
+ },
168
+ },
169
+ }),
170
+ Type: 'NO_SOURCE',
171
+ },
172
+ TimeoutInMinutes: 60,
173
+ },
174
+ },
175
+ },
176
+ Outputs: {
177
+ [config_1.BASE_STACK_LAMBDA_IMAGE_BUILDER_LOGICAL_NAME]: {
178
+ Value: { Ref: config_1.BASE_STACK_LAMBDA_IMAGE_BUILDER_LOGICAL_NAME },
179
+ Export: {
180
+ Name: config_1.BASE_STACK_LAMBDA_IMAGE_BUILDER_EXPORTED_NAME,
181
+ },
182
+ },
183
+ },
184
+ };
185
+ };
186
+ exports.getLambdaImageBuilderTemplate = getLambdaImageBuilderTemplate;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLambdaLayerBuilderTemplate = exports.getBuildSpec = void 0;
4
+ const utils_1 = require("../../utils");
5
+ const config_1 = require("./config");
6
+ const CODE_BUILD_PROJECT_LOGS_GROUP_LOGICAL_ID = `${config_1.BASE_STACK_LAMBDA_LAYER_BUILDER_LOGICAL_NAME}LogsLogGroup`;
7
+ const CODE_BUILD_PROJECT_IAM_ROLE_LOGICAL_ID = `${config_1.BASE_STACK_LAMBDA_LAYER_BUILDER_LOGICAL_NAME}Role`;
8
+ /**
9
+ * https://docs.aws.amazon.com/codebuild/latest/userguide/build-spec-ref.html
10
+ */
11
+ const getBuildSpec = () => `
12
+ version: 0.2
13
+ phases:
14
+ install:
15
+ runtime-versions:
16
+ nodejs: 12
17
+ commands:
18
+ - npm i --no-bin-links --no-optional --no-package-lock --no-save --no-shrinkwrap $PACKAGE_NAME
19
+ - mkdir nodejs
20
+ - mv node_modules nodejs/node_modules
21
+ artifacts:
22
+ files:
23
+ - nodejs/**/*
24
+ name: $PACKAGE_NAME.zip
25
+ `.trim();
26
+ exports.getBuildSpec = getBuildSpec;
27
+ /**
28
+ * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html
29
+ */
30
+ const getLambdaLayerBuilderTemplate = () => {
31
+ return {
32
+ Resources: {
33
+ [CODE_BUILD_PROJECT_IAM_ROLE_LOGICAL_ID]: {
34
+ Type: 'AWS::IAM::Role',
35
+ Properties: {
36
+ AssumeRolePolicyDocument: {
37
+ Version: '2012-10-17',
38
+ Statement: [
39
+ {
40
+ Effect: 'Allow',
41
+ Principal: {
42
+ Service: ['codebuild.amazonaws.com'],
43
+ },
44
+ Action: ['sts:AssumeRole'],
45
+ },
46
+ ],
47
+ },
48
+ Path: (0, utils_1.getIamPath)(),
49
+ Policies: [
50
+ {
51
+ PolicyName: `${CODE_BUILD_PROJECT_IAM_ROLE_LOGICAL_ID}Policy`,
52
+ PolicyDocument: {
53
+ Version: '2012-10-17',
54
+ Statement: [
55
+ {
56
+ Effect: 'Allow',
57
+ Action: ['logs:CreateLogStream', 'logs:PutLogEvents'],
58
+ Resource: '*',
59
+ },
60
+ {
61
+ Effect: 'Allow',
62
+ Action: ['s3:*'],
63
+ Resource: [
64
+ {
65
+ 'Fn::Sub': [
66
+ // eslint-disable-next-line no-template-curly-in-string
67
+ 'arn:aws:s3:::${BucketName}',
68
+ {
69
+ BucketName: {
70
+ Ref: config_1.BASE_STACK_BUCKET_LOGICAL_NAME,
71
+ },
72
+ },
73
+ ],
74
+ },
75
+ {
76
+ 'Fn::Sub': [
77
+ // eslint-disable-next-line no-template-curly-in-string
78
+ 'arn:aws:s3:::${BucketName}/*',
79
+ {
80
+ BucketName: {
81
+ Ref: config_1.BASE_STACK_BUCKET_LOGICAL_NAME,
82
+ },
83
+ },
84
+ ],
85
+ },
86
+ ],
87
+ },
88
+ ],
89
+ },
90
+ },
91
+ ],
92
+ },
93
+ },
94
+ [CODE_BUILD_PROJECT_LOGS_GROUP_LOGICAL_ID]: {
95
+ Type: 'AWS::Logs::LogGroup',
96
+ DeletionPolicy: 'Delete',
97
+ Properties: {},
98
+ },
99
+ [config_1.BASE_STACK_LAMBDA_LAYER_BUILDER_LOGICAL_NAME]: {
100
+ Type: 'AWS::CodeBuild::Project',
101
+ Properties: {
102
+ Artifacts: {
103
+ Location: { Ref: config_1.BASE_STACK_BUCKET_LOGICAL_NAME },
104
+ NamespaceType: 'NONE',
105
+ OverrideArtifactName: true,
106
+ Packaging: 'ZIP',
107
+ Path: 'lambda-layers/packages',
108
+ Type: 'S3',
109
+ },
110
+ Environment: {
111
+ ComputeType: 'BUILD_GENERAL1_SMALL',
112
+ Image: 'aws/codebuild/standard:3.0',
113
+ Type: 'LINUX_CONTAINER',
114
+ },
115
+ LogsConfig: {
116
+ CloudWatchLogs: {
117
+ GroupName: {
118
+ Ref: `${CODE_BUILD_PROJECT_LOGS_GROUP_LOGICAL_ID}`,
119
+ },
120
+ Status: 'ENABLED',
121
+ },
122
+ },
123
+ ServiceRole: {
124
+ 'Fn::GetAtt': `${CODE_BUILD_PROJECT_IAM_ROLE_LOGICAL_ID}.Arn`,
125
+ },
126
+ Source: {
127
+ BuildSpec: (0, exports.getBuildSpec)(),
128
+ Type: 'NO_SOURCE',
129
+ },
130
+ },
131
+ },
132
+ },
133
+ Outputs: {
134
+ [config_1.BASE_STACK_LAMBDA_LAYER_BUILDER_LOGICAL_NAME]: {
135
+ Value: { Ref: config_1.BASE_STACK_LAMBDA_LAYER_BUILDER_LOGICAL_NAME },
136
+ },
137
+ },
138
+ };
139
+ };
140
+ exports.getLambdaLayerBuilderTemplate = getLambdaLayerBuilderTemplate;
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getVpcTemplate = void 0;
4
+ const change_case_1 = require("change-case");
5
+ const config_1 = require("../../config");
6
+ const config_2 = require("./config");
7
+ const getVpcTemplate = () => {
8
+ const vpcName = `${(0, change_case_1.pascalCase)(config_1.NAME)}VPC`;
9
+ const EC2_INTERNET_GATEWAY_LOGICAL_ID = 'EC2InternetGateway';
10
+ const EC2_ROUTE_TABLE_LOGICAL_ID = 'EC2RouteTable';
11
+ const EC2_VPC_LOGICAL_ID = 'EC2VCP';
12
+ const template = {
13
+ AWSTemplateFormatVersion: '2010-09-09',
14
+ Mappings: {
15
+ CidrMappings: {
16
+ VPC: {
17
+ CIDR: '10.0.0.0/16',
18
+ },
19
+ },
20
+ },
21
+ Resources: {
22
+ [EC2_VPC_LOGICAL_ID]: {
23
+ Type: 'AWS::EC2::VPC',
24
+ Properties: {
25
+ CidrBlock: {
26
+ 'Fn::FindInMap': ['CidrMappings', 'VPC', 'CIDR'],
27
+ },
28
+ EnableDnsHostnames: true,
29
+ EnableDnsSupport: true,
30
+ Tags: [
31
+ {
32
+ Key: 'Name',
33
+ Value: vpcName,
34
+ },
35
+ ],
36
+ },
37
+ },
38
+ [EC2_INTERNET_GATEWAY_LOGICAL_ID]: {
39
+ Type: 'AWS::EC2::InternetGateway',
40
+ Properties: {},
41
+ },
42
+ EC2VPCGatewayAttachment: {
43
+ Type: 'AWS::EC2::VPCGatewayAttachment',
44
+ Properties: {
45
+ InternetGatewayId: {
46
+ Ref: EC2_INTERNET_GATEWAY_LOGICAL_ID,
47
+ },
48
+ VpcId: {
49
+ Ref: EC2_VPC_LOGICAL_ID,
50
+ },
51
+ },
52
+ },
53
+ [EC2_ROUTE_TABLE_LOGICAL_ID]: {
54
+ Type: 'AWS::EC2::RouteTable',
55
+ Properties: {
56
+ Tags: [
57
+ {
58
+ Key: 'Name',
59
+ Value: {
60
+ 'Fn::Join': [' ', [vpcName, '-', EC2_ROUTE_TABLE_LOGICAL_ID]],
61
+ },
62
+ },
63
+ ],
64
+ VpcId: {
65
+ Ref: EC2_VPC_LOGICAL_ID,
66
+ },
67
+ },
68
+ },
69
+ EC2Route: {
70
+ Type: 'AWS::EC2::Route',
71
+ Properties: {
72
+ DestinationCidrBlock: '0.0.0.0/0',
73
+ GatewayId: {
74
+ Ref: EC2_INTERNET_GATEWAY_LOGICAL_ID,
75
+ },
76
+ RouteTableId: {
77
+ Ref: EC2_ROUTE_TABLE_LOGICAL_ID,
78
+ },
79
+ },
80
+ },
81
+ },
82
+ Outputs: {
83
+ VPCId: {
84
+ Value: {
85
+ Ref: EC2_VPC_LOGICAL_ID,
86
+ },
87
+ Export: {
88
+ Name: config_2.BASE_STACK_VPC_ID_EXPORTED_NAME,
89
+ },
90
+ },
91
+ VPCDefaultSecurityGroup: {
92
+ Value: {
93
+ 'Fn::GetAtt': [EC2_VPC_LOGICAL_ID, 'DefaultSecurityGroup'],
94
+ },
95
+ Export: {
96
+ Name: config_2.BASE_STACK_VPC_DEFAULT_SECURITY_GROUP_EXPORTED_NAME,
97
+ },
98
+ },
99
+ },
100
+ };
101
+ [
102
+ config_2.BASE_STACK_VPC_PUBLIC_SUBNET_0_EXPORTED_NAME,
103
+ config_2.BASE_STACK_VPC_PUBLIC_SUBNET_1_EXPORTED_NAME,
104
+ config_2.BASE_STACK_VPC_PUBLIC_SUBNET_2_EXPORTED_NAME,
105
+ ].forEach((publicSubnetExportedName, index) => {
106
+ const publicSubnetLogicalId = `PublicSubnet${index}EC2Subnet`;
107
+ const publicSubnetCidrMappings = `PublicSubnet${index}`;
108
+ template.Mappings.CidrMappings[publicSubnetCidrMappings] = {
109
+ CIDR: `10.0.${index}.0/24`,
110
+ };
111
+ template.Resources[publicSubnetLogicalId] = {
112
+ Type: 'AWS::EC2::Subnet',
113
+ Properties: {
114
+ AvailabilityZone: {
115
+ 'Fn::Select': [
116
+ index,
117
+ {
118
+ 'Fn::GetAZs': {
119
+ Ref: 'AWS::Region',
120
+ },
121
+ },
122
+ ],
123
+ },
124
+ CidrBlock: {
125
+ 'Fn::FindInMap': ['CidrMappings', publicSubnetCidrMappings, 'CIDR'],
126
+ },
127
+ MapPublicIpOnLaunch: true,
128
+ Tags: [
129
+ {
130
+ Key: 'Name',
131
+ Value: {
132
+ 'Fn::Join': [
133
+ ' ',
134
+ [EC2_VPC_LOGICAL_ID, '-', publicSubnetLogicalId],
135
+ ],
136
+ },
137
+ },
138
+ ],
139
+ VpcId: {
140
+ Ref: EC2_VPC_LOGICAL_ID,
141
+ },
142
+ },
143
+ };
144
+ template.Resources[`PublicSubnet${index}EC2SubnetRouteTableAssociation`] = {
145
+ Type: 'AWS::EC2::SubnetRouteTableAssociation',
146
+ Properties: {
147
+ RouteTableId: {
148
+ Ref: EC2_ROUTE_TABLE_LOGICAL_ID,
149
+ },
150
+ SubnetId: {
151
+ Ref: publicSubnetLogicalId,
152
+ },
153
+ },
154
+ };
155
+ if (!template.Outputs) {
156
+ template.Outputs = {};
157
+ }
158
+ template.Outputs[publicSubnetLogicalId] = {
159
+ Value: {
160
+ Ref: publicSubnetLogicalId,
161
+ },
162
+ Export: {
163
+ Name: publicSubnetExportedName,
164
+ },
165
+ };
166
+ });
167
+ return template;
168
+ };
169
+ exports.getVpcTemplate = getVpcTemplate;