-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
placement.ts
135 lines (121 loc) · 4.16 KB
/
placement.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import { BuiltInAttributes } from "./ec2/ec2-service";
import { CfnService } from "./ecs.generated";
/**
* Instance resource used for bin packing
*/
export enum BinPackResource {
/**
* Fill up hosts' CPU allocations first
*/
CPU = 'cpu',
/**
* Fill up hosts' memory allocations first
*/
MEMORY = 'memory',
}
/**
* The placement strategies to use for tasks in the service. For more information, see
* [Amazon ECS Task Placement Strategies](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html).
*
* Tasks will preferentially be placed on instances that match these rules.
*/
export class PlacementStrategy {
/**
* Places tasks evenly across all container instances in the cluster.
*/
public static spreadAcrossInstances() {
return new PlacementStrategy([{ type: 'spread', field: BuiltInAttributes.INSTANCE_ID }]);
}
/**
* Places tasks evenly based on the specified value.
*
* You can use one of the built-in attributes found on `BuiltInAttributes`
* or supply your own custom instance attributes. If more than one attribute
* is supplied, spreading is done in order.
*
* @default attributes instanceId
*/
public static spreadAcross(...fields: string[]) {
if (fields.length === 0) {
throw new Error('spreadAcross: give at least one field to spread by');
}
return new PlacementStrategy(fields.map(field => ({ type: 'spread', field })));
}
/**
* Places tasks on container instances with the least available amount of CPU capacity.
*
* This minimizes the number of instances in use.
*/
public static packedByCpu() {
return PlacementStrategy.packedBy(BinPackResource.CPU);
}
/**
* Places tasks on container instances with the least available amount of memory capacity.
*
* This minimizes the number of instances in use.
*/
public static packedByMemory() {
return PlacementStrategy.packedBy(BinPackResource.MEMORY);
}
/**
* Places tasks on the container instances with the least available capacity of the specified resource.
*/
public static packedBy(resource: BinPackResource) {
return new PlacementStrategy([{ type: 'binpack', field: resource }]);
}
/**
* Places tasks randomly.
*/
public static randomly() {
return new PlacementStrategy([{ type: 'random' }]);
}
/**
* Constructs a new instance of the PlacementStrategy class.
*/
private constructor(private readonly json: CfnService.PlacementStrategyProperty[]) {
}
/**
* Return the placement JSON
*/
public toJson(): CfnService.PlacementStrategyProperty[] {
return this.json;
}
}
/**
* The placement constraints to use for tasks in the service. For more information, see
* [Amazon ECS Task Placement Constraints](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html).
*
* Tasks will only be placed on instances that match these rules.
*/
export class PlacementConstraint {
/**
* Use distinctInstance to ensure that each task in a particular group is running on a different container instance.
*/
public static distinctInstances() {
return new PlacementConstraint([{ type: 'distinctInstance' }]);
}
/**
* Use memberOf to restrict the selection to a group of valid candidates specified by a query expression.
*
* Multiple expressions can be specified. For more information, see
* [Cluster Query Language](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html).
*
* You can specify multiple expressions in one call. The tasks will only be placed on instances matching all expressions.
*
* @see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html
*/
public static memberOf(...expressions: string[]) {
return new PlacementConstraint(expressions.map(expression => ({ type: 'memberOf', expression })));
}
/**
* Constructs a new instance of the PlacementConstraint class.
*/
private constructor(private readonly json: CfnService.PlacementConstraintProperty[]) {
}
/**
* Return the placement JSON
*/
public toJson(): CfnService.PlacementConstraintProperty[] {
return this.json;
}
}