@@ -147,6 +147,10 @@ type aliasCertValidator interface {
147
147
ValidateCertAliases (aliases []string , certs []string ) error
148
148
}
149
149
150
+ type configDescriber interface {
151
+ Manifest () ([]byte , error )
152
+ }
153
+
150
154
type workloadDeployer struct {
151
155
name string
152
156
app * config.Application
@@ -165,12 +169,30 @@ type workloadDeployer struct {
165
169
endpointGetter endpointGetter
166
170
spinner spinner
167
171
templateFS template.Reader
172
+ envConfigDescriber configDescriber
168
173
169
174
// Cached variables.
170
175
defaultSess * session.Session
171
176
defaultSessWithEnvRegion * session.Session
172
177
envSess * session.Session
173
178
store * config.Store
179
+ environmentConfig * manifest.Environment
180
+ }
181
+
182
+ func (d * workloadDeployer ) cachedEnvironmentConfig () (* manifest.Environment , error ) {
183
+ if d .environmentConfig != nil {
184
+ return d .environmentConfig , nil
185
+ }
186
+ mft , err := d .envConfigDescriber .Manifest ()
187
+ if err != nil {
188
+ return nil , fmt .Errorf ("read the manifest used to deploy environment %s: %w" , d .env .Name , err )
189
+ }
190
+ env , err := manifest .UnmarshalEnvironment (mft )
191
+ if err != nil {
192
+ return nil , fmt .Errorf ("unmarshal the manifest used to deploy environment %s: %w" , d .env .Name , err )
193
+ }
194
+ d .environmentConfig = env
195
+ return d .environmentConfig , nil
174
196
}
175
197
176
198
// WorkloadDeployerInput is the input to for workloadDeployer constructor.
@@ -220,7 +242,7 @@ func newWorkloadDeployer(in *WorkloadDeployerInput) (*workloadDeployer, error) {
220
242
imageBuilderPusher := repository .NewWithURI (
221
243
ecr .New (defaultSessEnvRegion ), repoName , resources .RepositoryURLs [in .Name ])
222
244
store := config .NewSSMStore (identity .New (defaultSession ), ssm .New (defaultSession ), aws .StringValue (defaultSession .Config .Region ))
223
- endpointGetter , err := describe .NewEnvDescriber (describe.NewEnvDescriberConfig {
245
+ envDescriber , err := describe .NewEnvDescriber (describe.NewEnvDescriberConfig {
224
246
App : in .App .Name ,
225
247
Env : in .Env .Name ,
226
248
ConfigStore : store ,
@@ -240,9 +262,10 @@ func newWorkloadDeployer(in *WorkloadDeployerInput) (*workloadDeployer, error) {
240
262
templater : addonsSvc ,
241
263
imageBuilderPusher : imageBuilderPusher ,
242
264
deployer : cloudformation .New (envSession ),
243
- endpointGetter : endpointGetter ,
265
+ endpointGetter : envDescriber ,
244
266
spinner : termprogress .NewSpinner (log .DiagnosticWriter ),
245
267
templateFS : template .New (),
268
+ envConfigDescriber : envDescriber ,
246
269
247
270
defaultSess : defaultSession ,
248
271
defaultSessWithEnvRegion : defaultSessEnvRegion ,
@@ -999,9 +1022,13 @@ func (d *lbWebSvcDeployer) stackConfiguration(in *StackRuntimeConfiguration) (*s
999
1022
}
1000
1023
opts = append (opts , stack .WithNLB (cidrBlocks ))
1001
1024
}
1025
+ envConfig , err := d .cachedEnvironmentConfig ()
1026
+ if err != nil {
1027
+ return nil , err
1028
+ }
1002
1029
conf , err := stack .NewLoadBalancedWebService (stack.LoadBalancedWebServiceConfig {
1003
1030
App : d .app ,
1004
- Env : d . env ,
1031
+ EnvManifest : envConfig ,
1005
1032
Manifest : d .lbMft ,
1006
1033
RuntimeConfig : * rc ,
1007
1034
RootUserARN : in .RootUserARN ,
@@ -1026,9 +1053,13 @@ func (d *backendSvcDeployer) stackConfiguration(in *StackRuntimeConfiguration) (
1026
1053
return nil , err
1027
1054
}
1028
1055
1056
+ envConfig , err := d .cachedEnvironmentConfig ()
1057
+ if err != nil {
1058
+ return nil , err
1059
+ }
1029
1060
conf , err := stack .NewBackendService (stack.BackendServiceConfig {
1030
1061
App : d .app ,
1031
- Env : d . env ,
1062
+ EnvManifest : envConfig ,
1032
1063
Manifest : d .backendMft ,
1033
1064
RuntimeConfig : * rc ,
1034
1065
})
@@ -1261,15 +1292,19 @@ func (d *backendSvcDeployer) validateALBRuntime() error {
1261
1292
if d .backendMft .RoutingRule .IsEmpty () {
1262
1293
return nil
1263
1294
}
1295
+ hasImportedCerts , err := d .envHasImportedCertificates ()
1296
+ if err != nil {
1297
+ return err
1298
+ }
1264
1299
switch {
1265
- case d .backendMft .RoutingRule .Alias .IsEmpty () && d . env . HasImportedCerts () :
1300
+ case d .backendMft .RoutingRule .Alias .IsEmpty () && hasImportedCerts :
1266
1301
return & errSvcWithNoALBAliasDeployingToEnvWithImportedCerts {
1267
1302
name : d .name ,
1268
1303
envName : d .env .Name ,
1269
1304
}
1270
1305
case d .backendMft .RoutingRule .Alias .IsEmpty ():
1271
1306
return nil
1272
- case ! d . env . HasImportedCerts () :
1307
+ case ! hasImportedCerts :
1273
1308
return fmt .Errorf (`cannot specify "alias" in an environment without imported certs` )
1274
1309
}
1275
1310
@@ -1278,29 +1313,41 @@ func (d *backendSvcDeployer) validateALBRuntime() error {
1278
1313
return fmt .Errorf ("convert aliases to string slice: %w" , err )
1279
1314
}
1280
1315
1281
- if err := d .aliasCertValidator .ValidateCertAliases (aliases , d .env . CustomConfig . ImportCertARNs ); err != nil {
1316
+ if err := d .aliasCertValidator .ValidateCertAliases (aliases , d .environmentConfig . HTTPConfig . Private . Certificates ); err != nil {
1282
1317
return fmt .Errorf ("validate aliases against the imported certificate for env %s: %w" , d .env .Name , err )
1283
1318
}
1284
1319
1285
1320
return nil
1286
1321
}
1287
1322
1323
+ func (d * backendSvcDeployer ) envHasImportedCertificates () (bool , error ) {
1324
+ env , err := d .cachedEnvironmentConfig ()
1325
+ if err != nil {
1326
+ return false , err
1327
+ }
1328
+ return len (env .HTTPConfig .Private .Certificates ) != 0 , nil
1329
+ }
1288
1330
func (d * lbWebSvcDeployer ) validateALBRuntime () error {
1331
+ hasImportedCerts , err := d .envHasImportedCertificates ()
1332
+ if err != nil {
1333
+ return err
1334
+ }
1335
+
1289
1336
if d .lbMft .RoutingRule .Alias .IsEmpty () {
1290
- if d . env . HasImportedCerts () {
1337
+ if hasImportedCerts {
1291
1338
return & errSvcWithNoALBAliasDeployingToEnvWithImportedCerts {
1292
1339
name : d .name ,
1293
1340
envName : d .env .Name ,
1294
1341
}
1295
1342
}
1296
1343
return nil
1297
1344
}
1298
- if d . env . HasImportedCerts () {
1345
+ if hasImportedCerts {
1299
1346
aliases , err := d .lbMft .RoutingRule .Alias .ToStringSlice ()
1300
1347
if err != nil {
1301
1348
return fmt .Errorf ("convert aliases to string slice: %w" , err )
1302
1349
}
1303
- if err := d .aliasCertValidator .ValidateCertAliases (aliases , d .env . CustomConfig . ImportCertARNs ); err != nil {
1350
+ if err := d .aliasCertValidator .ValidateCertAliases (aliases , d .environmentConfig . HTTPConfig . Public . Certificates ); err != nil {
1304
1351
return fmt .Errorf ("validate aliases against the imported certificate for env %s: %w" , d .env .Name , err )
1305
1352
}
1306
1353
return nil
@@ -1320,7 +1367,12 @@ func (d *lbWebSvcDeployer) validateNLBRuntime() error {
1320
1367
if d .lbMft .NLBConfig .Aliases .IsEmpty () {
1321
1368
return nil
1322
1369
}
1323
- if d .env .HasImportedCerts () {
1370
+
1371
+ hasImportedCerts , err := d .envHasImportedCertificates ()
1372
+ if err != nil {
1373
+ return err
1374
+ }
1375
+ if hasImportedCerts {
1324
1376
return fmt .Errorf ("cannot specify nlb.alias when env %s imports one or more certificates" , d .env .Name )
1325
1377
}
1326
1378
if d .app .Domain == "" {
@@ -1334,6 +1386,14 @@ func (d *lbWebSvcDeployer) validateNLBRuntime() error {
1334
1386
return validateLBWSAlias (d .lbMft .NLBConfig .Aliases , d .app , d .env .Name )
1335
1387
}
1336
1388
1389
+ func (d * lbWebSvcDeployer ) envHasImportedCertificates () (bool , error ) {
1390
+ env , err := d .cachedEnvironmentConfig ()
1391
+ if err != nil {
1392
+ return false , err
1393
+ }
1394
+ return len (env .HTTPConfig .Public .Certificates ) != 0 , nil
1395
+ }
1396
+
1337
1397
func validateLBWSAlias (aliases manifest.Alias , app * config.Application , envName string ) error {
1338
1398
if aliases .IsEmpty () {
1339
1399
return nil
0 commit comments