compose/ecs/pkg/amazon/compose.go

91 lines
2.3 KiB
Go

package amazon
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/ecs"
"github.com/compose-spec/compose-go/types"
"github.com/docker/ecs-plugin/pkg/compose"
"github.com/docker/ecs-plugin/pkg/convert"
"github.com/sirupsen/logrus"
)
func (c *client) ComposeUp(project *compose.Project) error {
vpc, err := c.GetDefaultVPC()
if err != nil {
return err
}
subnets, err := c.GetSubNets(vpc)
if err != nil {
return err
}
securityGroup, err := c.CreateSecurityGroup(project, vpc)
if err != nil {
return err
}
logGroup, err := c.GetOrCreateLogGroup(project)
if err != nil {
return err
}
for _, service := range project.Services {
_, err = c.CreateService(project, service, securityGroup, subnets, logGroup)
if err != nil {
return err
}
}
return nil
}
func (c *client) CreateService(project *compose.Project, service types.ServiceConfig, securityGroup *string, subnets []*string, logGroup *string) (*string, error) {
task, err := convert.Convert(project, service)
if err != nil {
return nil, err
}
role, err := c.GetEcsTaskExecutionRole(service)
if err != nil {
return nil, err
}
task.ExecutionRoleArn = role
for _, def := range task.ContainerDefinitions {
def.LogConfiguration.Options["awslogs-group"] = logGroup
def.LogConfiguration.Options["awslogs-stream-prefix"] = aws.String(service.Name)
def.LogConfiguration.Options["awslogs-region"] = aws.String(c.Region)
}
arn, err := c.RegisterTaskDefinition(task)
if err != nil {
return nil, err
}
logrus.Debug("Create Service")
created, err := c.ECS.CreateService(&ecs.CreateServiceInput{
Cluster: aws.String(c.Cluster),
DesiredCount: aws.Int64(1), // FIXME get from deploy options
LaunchType: aws.String(ecs.LaunchTypeFargate), //FIXME use service.Isolation tro select EC2 vs Fargate
NetworkConfiguration: &ecs.NetworkConfiguration{
AwsvpcConfiguration: &ecs.AwsVpcConfiguration{
AssignPublicIp: aws.String(ecs.AssignPublicIpEnabled),
SecurityGroups: []*string{securityGroup},
Subnets: subnets,
},
},
ServiceName: aws.String(service.Name),
SchedulingStrategy: aws.String(ecs.SchedulingStrategyReplica),
TaskDefinition: arn,
})
for _, port := range service.Ports {
err = c.ExposePort(securityGroup, port)
if err != nil {
return nil, err
}
}
return created.Service.ServiceArn, err
}