in internal/pkg/cli/deploy/deploy.go [474:577]
func (d *workloadDeployer) stackConfiguration(in *DeployWorkloadInput) (*stackConfigurationOutput, error) {
rc, err := d.runtimeConfig(in)
if err != nil {
return nil, err
}
in.NewSvcUpdater(func(s *session.Session) ServiceForceUpdater {
return ecs.New(s)
})
var output stackConfigurationOutput
switch t := d.mft.(type) {
case *manifest.LoadBalancedWebService:
if err := validateLBWSRuntime(d.app, d.env.Name, t, in.AppVersionGetter); err != nil {
return nil, err
}
var opts []stack.LoadBalancedWebServiceOption
if !t.NLBConfig.IsEmpty() {
cidrBlocks, err := in.PublicCIDRBlocksGetter.PublicCIDRBlocks()
if err != nil {
return nil, fmt.Errorf("get public CIDR blocks information from the VPC of environment %s: %w", d.env.Name, err)
}
opts = append(opts, stack.WithNLB(cidrBlocks))
}
if d.app.RequiresDNSDelegation() {
opts = append(opts, stack.WithDNSDelegation(deploy.AppInformation{
Name: d.app.Name,
DNSName: d.app.Domain,
AccountPrincipalARN: in.RootUserARN,
}))
if !t.RoutingRule.Disabled() {
opts = append(opts, stack.WithHTTPS())
}
}
output.conf, err = stack.NewLoadBalancedWebService(t, d.env.Name, d.app.Name, *rc, opts...)
case *manifest.RequestDrivenWebService:
if d.app.Domain == "" && t.Alias != nil {
log.Errorf(aliasUsedWithoutDomainFriendlyText)
return nil, errors.New("alias specified when application is not associated with a domain")
}
in.NewSvcUpdater(func(s *session.Session) ServiceForceUpdater {
return apprunner.New(s)
})
appInfo := deploy.AppInformation{
Name: d.app.Name,
DNSName: d.app.Domain,
AccountPrincipalARN: in.RootUserARN,
}
if t.Alias == nil {
output.conf, err = stack.NewRequestDrivenWebService(t, d.env.Name, appInfo, *rc)
break
}
output.rdSvcAlias = aws.StringValue(t.Alias)
if err = validateRDSvcAliasAndAppVersion(d.name,
aws.StringValue(t.Alias), d.env.Name, d.app, in.AppVersionGetter); err != nil {
return nil, err
}
var urls map[string]string
if urls, err = uploadRDWSCustomResources(&uploadRDWSCustomResourcesInput{
customResourceUploader: in.CustomResourceUploader,
s3Uploader: in.S3Uploader,
s3Bucket: d.s3Bucket,
}); err != nil {
return nil, err
}
output.conf, err = stack.NewRequestDrivenWebServiceWithAlias(t, d.env.Name, appInfo, *rc, urls)
case *manifest.BackendService:
output.conf, err = stack.NewBackendService(t, d.env.Name, d.app.Name, *rc)
case *manifest.WorkerService:
var topics []deploy.Topic
topics, err = in.SNSTopicsLister.ListSNSTopics(d.app.Name, d.env.Name)
if err != nil {
return nil, fmt.Errorf("get SNS topics for app %s and environment %s: %w", d.app.Name, d.env.Name, err)
}
var topicARNs []string
for _, topic := range topics {
topicARNs = append(topicARNs, topic.ARN())
}
type subscriptions interface {
Subscriptions() []manifest.TopicSubscription
}
subscriptionGetter, ok := d.mft.(subscriptions)
if !ok {
return nil, errors.New("manifest does not have required method Subscriptions")
}
// Cache the subscriptions for later.
output.subscriptions = subscriptionGetter.Subscriptions()
if err = validateTopicsExist(output.subscriptions, topicARNs, d.app.Name, d.env.Name); err != nil {
return nil, err
}
output.conf, err = stack.NewWorkerService(t, d.env.Name, d.app.Name, *rc)
default:
return nil, fmt.Errorf("unknown manifest type %T while creating the CloudFormation stack", t)
}
if err != nil {
return nil, fmt.Errorf("create stack configuration: %w", err)
}
return &output, nil
}