compose.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package amazon
  2. import (
  3. "github.com/aws/aws-sdk-go/aws"
  4. "github.com/aws/aws-sdk-go/service/ecs"
  5. "github.com/compose-spec/compose-go/types"
  6. "github.com/docker/ecs-plugin/pkg/compose"
  7. "github.com/docker/ecs-plugin/pkg/convert"
  8. "github.com/sirupsen/logrus"
  9. )
  10. func (c *client) ComposeUp(project *compose.Project) error {
  11. vpc, err := c.GetDefaultVPC()
  12. if err != nil {
  13. return err
  14. }
  15. subnets, err := c.GetSubNets(vpc)
  16. if err != nil {
  17. return err
  18. }
  19. securityGroup, err := c.CreateSecurityGroup(project, vpc)
  20. if err != nil {
  21. return err
  22. }
  23. logGroup, err := c.GetOrCreateLogGroup(project)
  24. if err != nil {
  25. return err
  26. }
  27. for _, service := range project.Services {
  28. _, err = c.CreateService(project, service, securityGroup, subnets, logGroup)
  29. if err != nil {
  30. return err
  31. }
  32. }
  33. return nil
  34. }
  35. func (c *client) CreateService(project *compose.Project, service types.ServiceConfig, securityGroup *string, subnets []*string, logGroup *string) (*string, error) {
  36. task, err := convert.Convert(project, service)
  37. if err != nil {
  38. return nil, err
  39. }
  40. role, err := c.GetEcsTaskExecutionRole(service)
  41. if err != nil {
  42. return nil, err
  43. }
  44. task.ExecutionRoleArn = role
  45. for _, def := range task.ContainerDefinitions {
  46. def.LogConfiguration.Options["awslogs-group"] = logGroup
  47. def.LogConfiguration.Options["awslogs-stream-prefix"] = aws.String(service.Name)
  48. def.LogConfiguration.Options["awslogs-region"] = aws.String(c.Region)
  49. }
  50. arn, err := c.RegisterTaskDefinition(task)
  51. if err != nil {
  52. return nil, err
  53. }
  54. logrus.Debug("Create Service")
  55. created, err := c.ECS.CreateService(&ecs.CreateServiceInput{
  56. Cluster: aws.String(c.Cluster),
  57. DesiredCount: aws.Int64(1), // FIXME get from deploy options
  58. LaunchType: aws.String(ecs.LaunchTypeFargate), //FIXME use service.Isolation tro select EC2 vs Fargate
  59. NetworkConfiguration: &ecs.NetworkConfiguration{
  60. AwsvpcConfiguration: &ecs.AwsVpcConfiguration{
  61. AssignPublicIp: aws.String(ecs.AssignPublicIpEnabled),
  62. SecurityGroups: []*string{securityGroup},
  63. Subnets: subnets,
  64. },
  65. },
  66. ServiceName: aws.String(service.Name),
  67. SchedulingStrategy: aws.String(ecs.SchedulingStrategyReplica),
  68. TaskDefinition: arn,
  69. })
  70. for _, port := range service.Ports {
  71. err = c.ExposePort(securityGroup, port)
  72. if err != nil {
  73. return nil, err
  74. }
  75. }
  76. return created.Service.ServiceArn, err
  77. }