Documentation ¶
Overview ¶
Package cloudformation implements the Scheduler interface for ECS by using CloudFormation to provision and update resources.
Index ¶
- Constants
- Variables
- func HostedZone(config client.ConfigProvider, hostedZoneID string) (*route53.HostedZone, error)
- type ContainerDefinitionProperties
- type CustomTaskDefinitionProperties
- type EmpireTemplate
- func (t *EmpireTemplate) Build(app *scheduler.App) (*troposphere.Template, error)
- func (t *EmpireTemplate) ContainerDefinition(app *scheduler.App, p *scheduler.Process) *ecs.ContainerDefinition
- func (t *EmpireTemplate) Execute(w io.Writer, data interface{}) error
- func (t *EmpireTemplate) Validate() error
- type MigrationScheduler
- func (s *MigrationScheduler) Backend(appID string) (scheduler.Scheduler, error)
- func (s *MigrationScheduler) Instances(ctx context.Context, appID string) ([]*scheduler.Instance, error)
- func (s *MigrationScheduler) Migrate(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream, ...) error
- func (s *MigrationScheduler) Remove(ctx context.Context, appID string) error
- func (s *MigrationScheduler) Restart(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
- func (s *MigrationScheduler) Run(ctx context.Context, app *scheduler.App, process *scheduler.Process, ...) error
- func (s *MigrationScheduler) Stop(ctx context.Context, id string) error
- func (s *MigrationScheduler) Submit(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
- type PortMappingProperties
- type Scheduler
- func (s *Scheduler) Instances(ctx context.Context, app string) ([]*scheduler.Instance, error)
- func (s *Scheduler) Remove(ctx context.Context, appID string) error
- func (s *Scheduler) Restart(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
- func (m *Scheduler) Run(ctx context.Context, app *scheduler.App, process *scheduler.Process, ...) error
- func (s *Scheduler) Services(appID string) (map[string]string, error)
- func (s *Scheduler) Stop(ctx context.Context, taskID string) error
- func (s *Scheduler) Submit(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
- func (s *Scheduler) SubmitWithOptions(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream, ...) error
- type SubmitOptions
- type TaskDefinitionProperties
- type Template
Constants ¶
const ( MaxDescribeTasks = 100 MaxDescribeServices = 10 )
ECS limits
const ( // For HTTP/HTTPS/TCP services, we allocate an ELB and map it's instance port to // the container port. This is the port that processes within the container // should bind to. This value is also exposed to the container through the PORT // environment variable. ContainerPort = 8080 )
const (
MaxTemplateSize = 460800 // bytes
)
CloudFormation limits
See http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
const MigrationEnvVar = "EMPIRE_SCHEDULER_MIGRATION"
This is the environment variable in the application that determines what step of the migration we should transition to. A basic migration flow would look like:
- `emp set EMPIRE_SCHEDULER_MIGRATION=step1`: CloudFormation stack is created without any DNS changes.
- User removes the old CNAME manually in the AWS Console, then sets the `DNS` parameter in the CloudFormation stack to `true`.
- `emp set EMPIRE_SCHEDULER_MIGRATION=step2`: The old AWS resources are removed.
- `emp unset EMPIRE_SCHEDULER_MIGRATION`: All done.
Variables ¶
var ( Ref = troposphere.Ref GetAtt = troposphere.GetAtt Equals = troposphere.Equals Join = troposphere.Join )
var DefaultStackNameTemplate = template.Must(template.New("stack_name").Parse("{{.Name}}"))
DefaultStackNameTemplate is the default text/template for generating a CloudFormation stack name for an app.
var ErrMigrating = errors.New("app is currently being migrated to a CloudFormation stack. Sit tight...")
ErrMigrating is returned when the application is being migrated.
Functions ¶
func HostedZone ¶
func HostedZone(config client.ConfigProvider, hostedZoneID string) (*route53.HostedZone, error)
HostedZone returns the HostedZone for the ZoneID.
Types ¶
type ContainerDefinitionProperties ¶ added in v0.11.0
type ContainerDefinitionProperties struct { Command interface{} `json:",omitempty"` Cpu interface{} `json:",omitempty"` DockerLabels map[string]interface{} `json:",omitempty"` Environment interface{} `json:",omitempty"` Essential interface{} `json:",omitempty"` Image interface{} `json:",omitempty"` Memory interface{} `json:",omitempty"` Name interface{} `json:",omitempty"` PortMappings []*PortMappingProperties `json:",omitempty"` Ulimits interface{} `json:",omitempty"` LogConfiguration interface{} `json:",omitempty"` }
type CustomTaskDefinitionProperties ¶ added in v0.11.0
type CustomTaskDefinitionProperties struct { ContainerDefinitions []*ContainerDefinitionProperties `json:",omitempty"` Family interface{} `json:",omitempty"` ServiceToken interface{} `json:",omitempty"` Volumes []interface{} }
type EmpireTemplate ¶
type EmpireTemplate struct { // By default, the JSON will not have any whitespace or newlines, which // helps prevent templates from going over the maximum size limit. If // you care about readability, you can set this to true. NoCompress bool // The ECS cluster to run the services in. Cluster string // The VPC to create ALB target groups within. Should be the same VPC // that ECS services will run within. VpcId string // The hosted zone to add CNAME's to. HostedZone *route53.HostedZone // The ID of the security group to assign to internal load balancers. InternalSecurityGroupID string // The ID of the security group to assign to external load balancers. ExternalSecurityGroupID string // The Subnet IDs to assign when creating internal load balancers. InternalSubnetIDs []string // The Subnet IDs to assign when creating external load balancers. ExternalSubnetIDs []string // The name or ARN of the IAM role to allow ECS, CloudWatch Events, and Lambda // to assume. ServiceRole string // The ARN of the SNS topic to provision instance ports. CustomResourcesTopic string LogConfiguration *ecs.LogConfiguration // Any extra outputs to attach to the template. ExtraOutputs map[string]troposphere.Output }
This implements the Template interface to create a suitable CloudFormation template for an Empire app.
func (*EmpireTemplate) Build ¶
func (t *EmpireTemplate) Build(app *scheduler.App) (*troposphere.Template, error)
Build builds a Go representation of a CloudFormation template for the app.
func (*EmpireTemplate) ContainerDefinition ¶
func (t *EmpireTemplate) ContainerDefinition(app *scheduler.App, p *scheduler.Process) *ecs.ContainerDefinition
ContainerDefinition generates an ECS ContainerDefinition for a process.
func (*EmpireTemplate) Execute ¶
func (t *EmpireTemplate) Execute(w io.Writer, data interface{}) error
Execute builds the template, and writes it to w.
func (*EmpireTemplate) Validate ¶
func (t *EmpireTemplate) Validate() error
Validate checks that all of the expected values are provided.
type MigrationScheduler ¶
type MigrationScheduler struct {
// contains filtered or unexported fields
}
This is a scheduler.Scheduler implementation that wraps the newer cloudformation.Scheduler and the older ecs.Scheduler to migrate applications over the the new CloudFormation based scheduler.
It uses a sql table to determine what scheduling backend should be used. Apps can be migrated from the ecs scheduler to the cloudformation scheduler by using the Migrate function.
func NewMigrationScheduler ¶
NewMigrationScheduler returns a new MigrationScheduler instance.
func (*MigrationScheduler) Backend ¶
func (s *MigrationScheduler) Backend(appID string) (scheduler.Scheduler, error)
Backend returns the scheduling backend to use for the given app.
func (*MigrationScheduler) Migrate ¶
func (s *MigrationScheduler) Migrate(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream, state, desiredState string) error
Migrate submits the app to the CloudFormation scheduler, waits for the stack to successfully create, then removes the old API managed resources using the ECS scheduler.
func (*MigrationScheduler) Remove ¶
func (s *MigrationScheduler) Remove(ctx context.Context, appID string) error
func (*MigrationScheduler) Restart ¶ added in v0.11.0
func (s *MigrationScheduler) Restart(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
func (*MigrationScheduler) Stop ¶
func (s *MigrationScheduler) Stop(ctx context.Context, id string) error
func (*MigrationScheduler) Submit ¶
func (s *MigrationScheduler) Submit(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
type PortMappingProperties ¶ added in v0.11.0
type PortMappingProperties struct { ContainerPort interface{} `json:",omitempty"` HostPort interface{} `json:",omitempty"` }
type Scheduler ¶
type Scheduler struct { // Template is a text/template that will be executed using the // twelvefactor.Manifest as data. This template should return a valid // CloudFormation JSON template. Template Template // The ECS cluster to run tasks in. Cluster string // The name of the bucket to store templates in. Bucket string // A text/template that will generate the stack name for the app. This // template will be executed with a scheduler.App as it's data. StackNameTemplate *template.Template // Any additional tags to add to stacks. Tags []*cloudformation.Tag // contains filtered or unexported fields }
Scheduler implements the scheduler.Scheduler interface using CloudFormation to provision resources.
func NewScheduler ¶
func NewScheduler(db *sql.DB, config client.ConfigProvider) *Scheduler
NewScheduler returns a new Scheduler instance.
func (*Scheduler) Run ¶
func (m *Scheduler) Run(ctx context.Context, app *scheduler.App, process *scheduler.Process, in io.Reader, out io.Writer) error
Run registers a TaskDefinition for the process, and calls RunTask.
func (*Scheduler) Services ¶
Services returns a map that maps the name of the process (e.g. web) to the ARN of the associated ECS service.
func (*Scheduler) Submit ¶
func (s *Scheduler) Submit(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream) error
Submit creates (or updates) the CloudFormation stack for the app.
func (*Scheduler) SubmitWithOptions ¶
func (s *Scheduler) SubmitWithOptions(ctx context.Context, app *scheduler.App, ss scheduler.StatusStream, opts SubmitOptions) error
SubmitWithOptions submits (or updates) the CloudFormation stack for the app.
type SubmitOptions ¶
type SubmitOptions struct { // When true, does not make any changes to DNS. This is only used when // migrating to this scheduler NoDNS *bool }
SubmitOptions are options provided to SubmitWithOptions.
type TaskDefinitionProperties ¶ added in v0.11.0
type TaskDefinitionProperties struct { ContainerDefinitions []*ContainerDefinitionProperties `json:",omitempty"` Volumes []interface{} }