ecs_deploy 1.0.4 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a731ec39a6928bb4365fbb4784b91dd92737eb5b5796da19e3be8185d6bc10b8
4
- data.tar.gz: '04758ae740d9ab1bb9108d5dcae1df72102fd161e0f96a38f1e30b461415bc7f'
3
+ metadata.gz: c835fe6c187c1e2558ba6de3c957bb41f3eafde5804b79fd611864f0ef32aa31
4
+ data.tar.gz: 47b1b66e32e8a246bd97658f85b473f5c07942d73e4bc932685a8fbe7386fd4a
5
5
  SHA512:
6
- metadata.gz: 429dc1f441f7a67a973293adf8c48a62671ab3f5710cee596186a7fe5773b772b643b9ef879fb0b2143d7f7100754b6521ec6823094122fec85bfd189ca3c306
7
- data.tar.gz: 03f568218e5e77e2c9b86560ac5dd4f41e19440f98da1ee102ee09057bc7ec8fdf7caa5366b56d06946d5887a0a60d8bae0c1ce04e80e0a50df7a51e40642da0
6
+ metadata.gz: e599e6a06c67bf78dc17a6b746ba680e8043440dda0870595bd2aa36cb08b6357eb3350c88875897510327fa261fb45cdbd7ff237f0cd5c52a1d6021f910d9fb
7
+ data.tar.gz: f65b908df4382062dec6ba228d1714df5f2b64a516c42450482767ebf48c52345a3d72db465c57fd6058f4082d6b07b2569ce18b369337a2eb71f2ffe9121769
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # v1.0
2
2
 
3
+ ## Release v1.0.6 - 2024/03/19
4
+
5
+ ### Enhancement
6
+
7
+ - Make region fallback logic consistent in Capistrano tasks https://github.com/reproio/ecs_deploy/pull/91
8
+ - Add runtime_platform to task_definition. https://github.com/reproio/ecs_deploy/pull/92
9
+
10
+ ### Bug fixes
11
+
12
+ - Delete option :placement_strategy if DAEMON service https://github.com/reproio/ecs_deploy/pull/93
13
+
14
+ ## Release v1.0.5 - 2023/03/15
15
+
16
+ ### Enhancement
17
+
18
+ - Add variable of capistrano `ecs_client_retry_params` to override parameter of ECS::Client#initialize https://github.com/reproio/ecs_deploy/pull/88
19
+
3
20
  ## Release v1.0.4 - 2023/02/10
4
21
 
5
22
  ### Bug fixes
data/README.md CHANGED
@@ -1,30 +1,26 @@
1
1
  # EcsDeploy
2
2
 
3
- Helper script for deployment to Amazon ECS.
3
+ Helper script for deployment to Amazon ECS, designed to be compatible with `capistrano`.
4
4
 
5
5
  This gem is experimental.
6
6
 
7
- Main purpose is combination with capistrano API.
8
-
9
7
  ## Installation
10
8
 
11
9
  Add this line to your application's Gemfile:
12
10
 
13
11
  ```ruby
14
- gem 'ecs_deploy', github: "reproio/ecs_deploy"
12
+ gem "ecs_deploy", github: "reproio/ecs_deploy"
15
13
  ```
16
14
 
17
15
  And then execute:
18
16
 
19
17
  $ bundle
20
18
 
21
- ## Usage
22
-
23
- Use by Capistrano.
19
+ ## Configuration
24
20
 
25
21
  ```ruby
26
22
  # Capfile
27
- require 'ecs_deploy/capistrano'
23
+ require "ecs_deploy/capistrano"
28
24
 
29
25
  # deploy.rb
30
26
  set :ecs_default_cluster, "ecs-cluster-name"
@@ -33,6 +29,7 @@ set :ecs_service_role, "customEcsServiceRole" # default: ecsServiceRole
33
29
  set :ecs_deploy_wait_timeout, 600 # default: 300
34
30
  set :ecs_wait_until_services_stable_max_attempts, 40 # optional
35
31
  set :ecs_wait_until_services_stable_delay, 15 # optional
32
+ set :ecs_client_params, { retry_mode: "standard", max_attempts: 10 } # default: {}
36
33
 
37
34
  set :ecs_tasks, [
38
35
  {
@@ -92,11 +89,11 @@ set :ecs_tasks, [
92
89
 
93
90
  set :ecs_scheduled_tasks, [
94
91
  {
95
- cluster: "default", # Unless this key, use fetch(:ecs_default_cluster)
92
+ cluster: "default", # Defaults to fetch(:ecs_default_cluster)
96
93
  rule_name: "schedule_name",
97
94
  schedule_expression: "cron(0 12 * * ? *)",
98
95
  description: "schedule_description", # Optional
99
- target_id: "task_name", # Unless this key, use task_definition_name
96
+ target_id: "task_name", # Defaults to the task_definition_name
100
97
  task_definition_name: "myapp-#{fetch(:rails_env)}",
101
98
  task_count: 2, # Default 1
102
99
  revision: 12, # Optional
@@ -129,12 +126,14 @@ set :ecs_services, [
129
126
  ]
130
127
  ```
131
128
 
129
+ ## Usage
130
+
132
131
  ```sh
133
- cap <stage> ecs:register_task_definition # register ecs_tasks as TaskDefinition
134
- cap <stage> ecs:deploy_scheduled_task # register ecs_scheduled_tasks to CloudWatchEvent
135
- cap <stage> ecs:deploy # create or update Service by ecs_services info
132
+ bundle exec cap <stage> ecs:register_task_definition # register ecs_tasks as TaskDefinition
133
+ bundle exec cap <stage> ecs:deploy_scheduled_task # register ecs_scheduled_tasks to CloudWatchEvent
134
+ bundle exec cap <stage> ecs:deploy # create or update Service by ecs_services info
136
135
 
137
- cap <stage> ecs:rollback # deregister current task definition and update Service by previous revision of current task definition
136
+ bundle exec cap <stage> ecs:rollback # deregister current task definition and update Service by previous revision of current task definition
138
137
  ```
139
138
 
140
139
  ### Rollback example
@@ -193,7 +192,7 @@ The autoscaler of `ecs_deploy` supports auto scaling of ECS services and cluster
193
192
 
194
193
  ### Prerequisits
195
194
 
196
- * You use a ECS cluster whose instances belong to either an auto scaling group or a spot fleet request
195
+ * An ECS cluster whose instances belong to either an Auto Scaling group or a Spot Fleet request
197
196
  * You have CloudWatch alarms and you want to scale services when their state changes
198
197
 
199
198
  ### How to use autoscaler
@@ -282,7 +281,7 @@ Then, execute the following command:
282
281
  ecs_auto_scaler <config yaml>
283
282
  ```
284
283
 
285
- I recommends deploy `ecs_auto_scaler` on ECS too.
284
+ It is recommended to run the `ecs_auto_scaler` via a container on ECS.
286
285
 
287
286
  ### Signals
288
287
 
@@ -459,7 +458,7 @@ The following permissions are required for the preceding configuration of "repro
459
458
 
460
459
  ### How to deploy faster with Auto Scaling Group
461
460
 
462
- Add following configuration to your deploy.rb and hooks if you need.
461
+ Add the following configuration and hooks to your `config/deploy.rb`:
463
462
 
464
463
  ```ruby
465
464
  # deploy.rb
@@ -35,7 +35,7 @@ module EcsDeploy
35
35
  if decreased_capacity > 0
36
36
  new_desired_capacity = current_asg.desired_capacity - decreased_capacity
37
37
  cluster_resource_manager.trigger_capacity_update(current_asg.desired_capacity, new_desired_capacity)
38
- @logger.info "#{log_prefix} Update desired_capacity to #{new_desired_capacity}"
38
+ @logger.info "#{log_prefix} Updated desired_capacity to #{new_desired_capacity}"
39
39
  else
40
40
  @logger.info "#{log_prefix} Tried to Update desired_capacity but there were no deregisterable instances"
41
41
  end
@@ -47,7 +47,7 @@ module EcsDeploy
47
47
  desired_capacity: desired_capacity,
48
48
  )
49
49
  cluster_resource_manager.trigger_capacity_update(current_asg.desired_capacity, desired_capacity)
50
- @logger.info "#{log_prefix} Update desired_capacity to #{desired_capacity}"
50
+ @logger.info "#{log_prefix} Updated desired_capacity to #{desired_capacity}"
51
51
  end
52
52
  rescue => e
53
53
  AutoScaler.error_logger.error(e)
@@ -74,7 +74,7 @@ module EcsDeploy
74
74
  )
75
75
  end
76
76
 
77
- @logger.info "#{log_prefix} Detach instances from ASG: #{instance_ids.inspect}"
77
+ @logger.info "#{log_prefix} Detached instances from ASG: #{instance_ids.inspect}"
78
78
  end
79
79
 
80
80
  private
@@ -89,7 +89,7 @@ module EcsDeploy
89
89
  auto_scaling_group_instances.any? {|instance| instance.instance_id == i.ec2_instance_id }
90
90
  end
91
91
 
92
- @logger.info "#{log_prefix} Fetch deregisterable instances: #{deregisterable_instances.map(&:ec2_instance_id).inspect}"
92
+ @logger.info "#{log_prefix} Fetched deregisterable instances: #{deregisterable_instances.map(&:ec2_instance_id).inspect}"
93
93
 
94
94
  az_to_instance_count = auto_scaling_group_instances.each_with_object(Hash.new(0)) { |i, h| h[i.availability_zone] += 1 }
95
95
  az_to_deregisterable_instances = deregisterable_instances.group_by do |i|
@@ -27,7 +27,7 @@ module EcsDeploy
27
27
 
28
28
  def acquire(capacity, timeout: nil)
29
29
  @mutex.synchronize do
30
- @logger&.debug("#{log_prefix} Try to acquire #{capacity} capacity (capacity: #{@capacity}, used_capacity: #{@used_capacity})")
30
+ @logger&.debug("#{log_prefix} Trying to acquire #{capacity} capacity (capacity: #{@capacity}, used_capacity: #{@used_capacity})")
31
31
  Timeout.timeout(timeout) do
32
32
  while @capacity - @used_capacity < capacity
33
33
  @resource.wait(@mutex)
@@ -77,7 +77,7 @@ module EcsDeploy
77
77
  return if new_desired_capacity == old_desired_capacity
78
78
 
79
79
  th = Thread.new do
80
- @logger&.info "#{log_prefix} Start updating capacity: #{old_desired_capacity} -> #{new_desired_capacity}"
80
+ @logger&.info "#{log_prefix} Updating capacity: #{old_desired_capacity} -> #{new_desired_capacity}"
81
81
  Timeout.timeout(180) do
82
82
  until @capacity == new_desired_capacity ||
83
83
  (new_desired_capacity > old_desired_capacity && @capacity > new_desired_capacity) ||
@@ -91,7 +91,7 @@ module EcsDeploy
91
91
 
92
92
  sleep interval
93
93
  end
94
- @logger&.info "#{log_prefix} capacity is updated to #{@capacity}"
94
+ @logger&.info "#{log_prefix} updated capacity to #{@capacity}"
95
95
  end
96
96
  rescue Timeout::Error => e
97
97
  msg = "#{log_prefix} `#{__method__}': #{e} (#{e.class})"
@@ -108,7 +108,7 @@ module EcsDeploy
108
108
  end
109
109
 
110
110
  if wait_until_capacity_updated
111
- @logger&.info "#{log_prefix} Wait for the capacity of active instances to become #{new_desired_capacity} from #{old_desired_capacity}"
111
+ @logger&.info "#{log_prefix} Waiting for the number of active instances to reach #{new_desired_capacity} (from #{old_desired_capacity})"
112
112
  th.join
113
113
  end
114
114
  end
@@ -79,7 +79,7 @@ module EcsDeploy
79
79
  cl = ecs_client(region)
80
80
  config_to_instance_ids.each do |config, instance_ids|
81
81
  if config.disable_draining == true || config.disable_draining == "true"
82
- @logger.info "Skip draining instances: region: #{region}, cluster: #{config.cluster}, instance_ids: #{instance_ids.inspect}"
82
+ @logger.info "Skipped draining instances: region: #{region}, cluster: #{config.cluster}, instance_ids: #{instance_ids.inspect}"
83
83
  next
84
84
  end
85
85
 
@@ -40,7 +40,7 @@ module EcsDeploy
40
40
  next if difference >= trigger.step
41
41
 
42
42
  if trigger.match?
43
- @logger.info "#{log_prefix} Fire upscale trigger by #{trigger.alarm_name} #{trigger.state}"
43
+ @logger.info "#{log_prefix} Firing upscale trigger by #{trigger.alarm_name} #{trigger.state}"
44
44
  difference = trigger.step
45
45
  end
46
46
  end
@@ -50,7 +50,7 @@ module EcsDeploy
50
50
  next if difference > 0 && !trigger.prioritized_over_upscale_triggers?
51
51
  next unless trigger.match?
52
52
 
53
- @logger.info "#{log_prefix} Fire downscale trigger by #{trigger.alarm_name} #{trigger.state}"
53
+ @logger.info "#{log_prefix} Firing downscale trigger by #{trigger.alarm_name} #{trigger.state}"
54
54
  difference = [difference, -trigger.step].min
55
55
  end
56
56
  end
@@ -124,28 +124,28 @@ module EcsDeploy
124
124
  if current_level < next_level && overheat? # next max
125
125
  level = next_level
126
126
  @reach_max_at = nil
127
- @logger.info "#{log_prefix} Service is overheat, uses next max count"
127
+ @logger.info "#{log_prefix} Service is overheated, uses next max count"
128
128
  elsif current_level < next_level && !overheat? # wait cooldown
129
129
  level = current_level
130
130
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
131
131
  @reach_max_at ||= now
132
- @logger.info "#{log_prefix} Service waits cooldown elapsed #{(now - @reach_max_at).to_i}sec"
132
+ @logger.info "#{log_prefix} Service waiting for cooldown period to elapse #{(now - @reach_max_at).to_i}sec"
133
133
  elsif current_level == next_level && next_desired_count >= max_task_count[current_level] # reach current max
134
134
  level = current_level
135
135
  now = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
136
136
  @reach_max_at ||= now
137
- @logger.info "#{log_prefix} Service waits cooldown elapsed #{(now - @reach_max_at).to_i}sec"
137
+ @logger.info "#{log_prefix} Service waiting for cooldown period to elapse #{(now - @reach_max_at).to_i}sec"
138
138
  if next_desired_count > max_task_count[current_level] && current_level == max_task_count.size - 1
139
139
  @logger.warn "#{log_prefix} Desired count has reached the maximum value and couldn't be increased"
140
140
  end
141
141
  elsif current_level == next_level && next_desired_count < max_task_count[current_level]
142
142
  level = current_level
143
143
  @reach_max_at = nil
144
- @logger.info "#{log_prefix} Service clears cooldown state"
144
+ @logger.info "#{log_prefix} Service has finished cooling down"
145
145
  elsif current_level > next_level
146
146
  level = next_level
147
147
  @reach_max_at = nil
148
- @logger.info "#{log_prefix} Service clears cooldown state"
148
+ @logger.info "#{log_prefix} Service has finished cooling down"
149
149
  end
150
150
 
151
151
  next_desired_count = [next_desired_count, max_task_count[level]].min
@@ -156,7 +156,7 @@ module EcsDeploy
156
156
  end
157
157
 
158
158
  @last_updated_at = Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
159
- @logger.info "#{log_prefix} Update desired_count to #{next_desired_count}"
159
+ @logger.info "#{log_prefix} Updated desired_count to #{next_desired_count}"
160
160
  rescue => e
161
161
  AutoScaler.error_logger.error(e)
162
162
  end
@@ -197,7 +197,7 @@ module EcsDeploy
197
197
 
198
198
  cl.wait_until(:services_stable, cluster: cluster, services: [name]) do |w|
199
199
  w.before_wait do
200
- @logger.debug "#{log_prefix} wait service stable"
200
+ @logger.debug "#{log_prefix} waiting for service to stabilize"
201
201
  end
202
202
  end
203
203
 
@@ -205,7 +205,7 @@ module EcsDeploy
205
205
  stopping_task_arns.each_slice(MAX_DESCRIBABLE_TASK_COUNT) do |arns|
206
206
  cl.wait_until(:tasks_stopped, cluster: cluster, tasks: arns) do |w|
207
207
  w.before_wait do
208
- @logger.debug "#{log_prefix} wait stopping tasks stopped"
208
+ @logger.debug "#{log_prefix} waiting for tasks to finish stopping"
209
209
  end
210
210
  end
211
211
  end
@@ -43,7 +43,7 @@ module EcsDeploy
43
43
  # Wait until the capacity is updated to prevent the process from terminating before container draining is completed
44
44
  wait_until_capacity_updated: desired_capacity < request_config.target_capacity,
45
45
  )
46
- @logger.info "#{log_prefix} Update desired_capacity to #{desired_capacity}"
46
+ @logger.info "#{log_prefix} Updated desired_capacity to #{desired_capacity}"
47
47
  rescue => e
48
48
  AutoScaler.error_logger.error(e)
49
49
  end
@@ -50,7 +50,7 @@ module EcsDeploy
50
50
  loop_with_polling_interval("loop of #{cluster_scaling_config.name}") do
51
51
  ths = cluster_scaling_config.service_configs.map do |service_config|
52
52
  Thread.new(service_config) do |s|
53
- @logger.debug "Start service scaling of #{s.name}"
53
+ @logger.debug "Scaling service #{s.name}"
54
54
  s.adjust_desired_count(cluster_scaling_config.cluster_resource_manager)
55
55
  end
56
56
  end
@@ -58,7 +58,7 @@ module EcsDeploy
58
58
 
59
59
  ths.each(&:join)
60
60
 
61
- @logger.debug "Start cluster scaling of #{cluster_scaling_config.name}"
61
+ @logger.debug "Scaling cluster #{cluster_scaling_config.name}"
62
62
 
63
63
  required_capacity = cluster_scaling_config.service_configs.sum { |s| s.desired_count * s.required_capacity }
64
64
  cluster_scaling_config.update_desired_capacity(required_capacity)
@@ -10,6 +10,7 @@ namespace :ecs do
10
10
  c.default_region = Array(fetch(:ecs_region))[0] if fetch(:ecs_region)
11
11
  c.ecs_wait_until_services_stable_max_attempts = fetch(:ecs_wait_until_services_stable_max_attempts) if fetch(:ecs_wait_until_services_stable_max_attempts)
12
12
  c.ecs_wait_until_services_stable_delay = fetch(:ecs_wait_until_services_stable_delay) if fetch(:ecs_wait_until_services_stable_delay)
13
+ c.ecs_client_params = fetch(:ecs_client_params) if fetch(:ecs_client_params)
13
14
  end
14
15
 
15
16
  if ENV["TARGET_CLUSTER"]
@@ -41,6 +42,7 @@ namespace :ecs do
41
42
  cpu: t[:cpu],
42
43
  memory: t[:memory],
43
44
  tags: t[:tags],
45
+ runtime_platform: t[:runtime_platform],
44
46
  )
45
47
  result = task_definition.register
46
48
  ecs_registered_tasks[region][t[:name]] = result
@@ -54,7 +56,7 @@ namespace :ecs do
54
56
  task deploy_scheduled_task: [:configure, :register_task_definition] do
55
57
  if fetch(:ecs_scheduled_tasks)
56
58
  regions = Array(fetch(:ecs_region))
57
- regions = [nil] if regions.empty?
59
+ regions = [EcsDeploy.config.default_region] if regions.empty?
58
60
  regions.each do |r|
59
61
  fetch(:ecs_scheduled_tasks).each do |t|
60
62
  scheduled_task = EcsDeploy::ScheduledTask.new(
@@ -84,7 +86,7 @@ namespace :ecs do
84
86
  task deploy: [:configure, :register_task_definition] do
85
87
  if fetch(:ecs_services)
86
88
  regions = Array(fetch(:ecs_region))
87
- regions = [nil] if regions.empty?
89
+ regions = [EcsDeploy.config.default_region] if regions.empty?
88
90
  regions.each do |r|
89
91
  services = fetch(:ecs_services).map do |service|
90
92
  if fetch(:target_cluster) && fetch(:target_cluster).size > 0
@@ -127,7 +129,7 @@ namespace :ecs do
127
129
  task rollback: [:configure] do
128
130
  if fetch(:ecs_services)
129
131
  regions = Array(fetch(:ecs_region))
130
- regions = [nil] if regions.empty?
132
+ regions = [EcsDeploy.config.default_region] if regions.empty?
131
133
 
132
134
  rollback_routes = {}
133
135
  regions.each do |r|
@@ -164,7 +166,7 @@ namespace :ecs do
164
166
 
165
167
  EcsDeploy.logger.info "#{current_task_definition_arn} -> #{rollback_arn}"
166
168
 
167
- raise "Past task_definition_arns is nothing" unless rollback_arn
169
+ raise "Past task_definition_arns is empty" unless rollback_arn
168
170
 
169
171
  service_options = {
170
172
  region: r,
@@ -8,7 +8,8 @@ module EcsDeploy
8
8
  :deploy_wait_timeout,
9
9
  :ecs_service_role,
10
10
  :ecs_wait_until_services_stable_max_attempts,
11
- :ecs_wait_until_services_stable_delay
11
+ :ecs_wait_until_services_stable_delay,
12
+ :ecs_client_params
12
13
 
13
14
  def initialize
14
15
  @log_level = :info
@@ -16,6 +17,7 @@ module EcsDeploy
16
17
  # The following values are the default values of Aws::ECS::Waiters::ServicesStable
17
18
  @ecs_wait_until_services_stable_max_attempts = 40
18
19
  @ecs_wait_until_services_stable_delay = 15
20
+ @ecs_client_params = {}
19
21
  end
20
22
  end
21
23
  end
@@ -21,7 +21,7 @@ module EcsDeploy
21
21
  def increase
22
22
  asg = fetch_auto_scaling_group
23
23
 
24
- @logger.info("Increase desired capacity of #{@auto_scaling_group_name}: #{asg.desired_capacity} => #{asg.max_size}")
24
+ @logger.info("Increasing desired capacity of #{@auto_scaling_group_name}: #{asg.desired_capacity} => #{asg.max_size}")
25
25
  as_client.update_auto_scaling_group(auto_scaling_group_name: @auto_scaling_group_name, desired_capacity: asg.max_size)
26
26
 
27
27
  # Run in background because increasing instances may take time
@@ -47,7 +47,7 @@ module EcsDeploy
47
47
  @logger.info("The capacity is already #{asg.desired_capacity}")
48
48
  return
49
49
  end
50
- @logger.info("Decrease desired capacity of #{@auto_scaling_group_name}: #{asg.desired_capacity} => #{@desired_capacity}")
50
+ @logger.info("Decreasing desired capacity of #{@auto_scaling_group_name}: #{asg.desired_capacity} => #{@desired_capacity}")
51
51
 
52
52
  container_instances = ecs_client.list_container_instances(cluster: @cluster).flat_map do |resp|
53
53
  ecs_client.describe_container_instances(
@@ -113,7 +113,7 @@ module EcsDeploy
113
113
  end
114
114
 
115
115
  def ecs_client
116
- @ecs_client ||= Aws::ECS::Client.new(aws_params)
116
+ @ecs_client ||= Aws::ECS::Client.new(aws_params.merge(EcsDeploy.config.ecs_client_params))
117
117
  end
118
118
 
119
119
  def fetch_auto_scaling_group
@@ -27,9 +27,10 @@ module EcsDeploy
27
27
  @platform_version = platform_version
28
28
  @group = group
29
29
  region ||= EcsDeploy.config.default_region
30
+ params ||= EcsDeploy.config.ecs_client_params
30
31
  @container_overrides = container_overrides
31
32
 
32
- @client = region ? Aws::ECS::Client.new(region: region) : Aws::ECS::Client.new
33
+ @client = region ? Aws::ECS::Client.new(params.merge(region: region)) : Aws::ECS::Client.new(params)
33
34
  @region = @client.config.region
34
35
  @cloud_watch_events = Aws::CloudWatchEvents::Client.new(region: @region)
35
36
  end
@@ -61,7 +62,7 @@ module EcsDeploy
61
62
  state: @enabled ? "ENABLED" : "DISABLED",
62
63
  description: @description,
63
64
  )
64
- EcsDeploy.logger.info "create cloudwatch event rule [#{res.rule_arn}] [#{@region}] [#{Paint['OK', :green]}]"
65
+ EcsDeploy.logger.info "created cloudwatch event rule [#{res.rule_arn}] [#{@region}] [#{Paint['OK', :green]}]"
65
66
  end
66
67
 
67
68
  def put_targets
@@ -89,7 +90,7 @@ module EcsDeploy
89
90
  targets: [target]
90
91
  )
91
92
  if res.failed_entry_count.zero?
92
- EcsDeploy.logger.info "create cloudwatch event target [#{@target_id}] [#{@region}] [#{Paint['OK', :green]}]"
93
+ EcsDeploy.logger.info "created cloudwatch event target [#{@target_id}] [#{@region}] [#{Paint['OK', :green]}]"
93
94
  else
94
95
  res.failed_entries.each do |entry|
95
96
  EcsDeploy.logger.error "failed to create cloudwatch event target [#{@region}] target_id=#{entry.target_id} error_code=#{entry.error_code} error_message=#{entry.error_message}"
@@ -49,7 +49,8 @@ module EcsDeploy
49
49
  @response = nil
50
50
 
51
51
  region ||= EcsDeploy.config.default_region
52
- @client = region ? Aws::ECS::Client.new(region: region) : Aws::ECS::Client.new
52
+ params ||= EcsDeploy.config.ecs_client_params
53
+ @client = region ? Aws::ECS::Client.new(params.merge(region: region)) : Aws::ECS::Client.new(params)
53
54
  @region = @client.config.region
54
55
 
55
56
  @delete = delete
@@ -102,9 +103,10 @@ module EcsDeploy
102
103
  if @scheduling_strategy == 'DAEMON'
103
104
  service_options[:scheduling_strategy] = @scheduling_strategy
104
105
  service_options.delete(:desired_count)
106
+ service_options.delete(:placement_strategy)
105
107
  end
106
108
  @response = @client.create_service(service_options)
107
- EcsDeploy.logger.info "create service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
109
+ EcsDeploy.logger.info "created service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
108
110
  else
109
111
  return delete_service if @delete
110
112
 
@@ -116,8 +118,11 @@ module EcsDeploy
116
118
  service_options.merge!({force_new_deployment: true}) if need_force_new_deployment?(current_service)
117
119
 
118
120
  update_tags(@service_name, @tags)
121
+ if @scheduling_strategy == 'DAEMON'
122
+ service_options.delete(:placement_strategy)
123
+ end
119
124
  @response = @client.update_service(service_options)
120
- EcsDeploy.logger.info "update service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
125
+ EcsDeploy.logger.info "updated service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
121
126
  end
122
127
  end
123
128
 
@@ -144,7 +149,7 @@ module EcsDeploy
144
149
  sleep 1
145
150
  end
146
151
  @client.delete_service(cluster: @cluster, service: @service_name)
147
- EcsDeploy.logger.info "delete service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
152
+ EcsDeploy.logger.info "deleted service [#{@service_name}] [#{@cluster}] [#{@region}] [#{Paint['OK', :green]}]"
148
153
  end
149
154
 
150
155
  def update_tags(service_name, tags)
@@ -181,11 +186,12 @@ module EcsDeploy
181
186
 
182
187
  def self.wait_all_running(services)
183
188
  services.group_by { |s| [s.cluster, s.region] }.flat_map do |(cl, region), ss|
184
- client = Aws::ECS::Client.new(region: region)
189
+ params ||= EcsDeploy.config.ecs_client_params
190
+ client = Aws::ECS::Client.new(params.merge(region: region))
185
191
  ss.reject(&:delete).map(&:service_name).each_slice(MAX_DESCRIBE_SERVICES).map do |chunked_service_names|
186
192
  Thread.new do
187
193
  EcsDeploy.config.ecs_wait_until_services_stable_max_attempts.times do
188
- EcsDeploy.logger.info "wait service stable [#{chunked_service_names.join(", ")}] [#{cl}]"
194
+ EcsDeploy.logger.info "waiting for services to stabilize [#{chunked_service_names.join(", ")}] [#{cl}]"
189
195
  resp = client.describe_services(cluster: cl, services: chunked_service_names)
190
196
  resp.services.each do |s|
191
197
  # cf. https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-ecs/lib/aws-sdk-ecs/waiters.rb#L91-L96
@@ -1,19 +1,13 @@
1
1
  module EcsDeploy
2
2
  class TaskDefinition
3
- RETRY_BACKOFF = lambda do |c|
4
- sleep(1)
5
- end
6
-
7
- RETRY_LIMIT = 10
8
-
9
3
  def self.deregister(arn, region: nil)
10
4
  region ||= EcsDeploy.config.default_region
11
- param = {retry_backoff: RETRY_BACKOFF, retry_limit: RETRY_LIMIT}
12
- client = region ? Aws::ECS::Client.new(param.merge(region: region)) : Aws::ECS::Client.new(param)
5
+ params ||= EcsDeploy.config.ecs_client_params
6
+ client = region ? Aws::ECS::Client.new(params.merge(region: region)) : Aws::ECS::Client.new(params)
13
7
  client.deregister_task_definition({
14
8
  task_definition: arn,
15
9
  })
16
- EcsDeploy.logger.info "deregister task definition [#{arn}] [#{client.config.region}] [#{Paint['OK', :green]}]"
10
+ EcsDeploy.logger.info "deregistered task definition [#{arn}] [#{client.config.region}] [#{Paint['OK', :green]}]"
17
11
  end
18
12
 
19
13
  def initialize(
@@ -23,12 +17,14 @@ module EcsDeploy
23
17
  execution_role_arn: nil,
24
18
  requires_compatibilities: nil,
25
19
  cpu: nil, memory: nil,
26
- tags: nil
20
+ tags: nil,
21
+ runtime_platform: {}
27
22
  )
28
23
  @task_definition_name = task_definition_name
29
24
  @task_role_arn = task_role_arn
30
25
  @execution_role_arn = execution_role_arn
31
26
  region ||= EcsDeploy.config.default_region
27
+ params ||= EcsDeploy.config.ecs_client_params
32
28
 
33
29
  @container_definitions = container_definitions.map do |cd|
34
30
  if cd[:docker_labels]
@@ -46,9 +42,9 @@ module EcsDeploy
46
42
  @cpu = cpu&.to_s
47
43
  @memory = memory&.to_s
48
44
  @tags = tags
49
- param = {retry_backoff: RETRY_BACKOFF, retry_limit: RETRY_LIMIT}
50
- @client = region ? Aws::ECS::Client.new(param.merge(region: region)) : Aws::ECS::Client.new(param)
45
+ @client = region ? Aws::ECS::Client.new(params.merge(region: region)) : Aws::ECS::Client.new(params)
51
46
  @region = @client.config.region
47
+ @runtime_platform = runtime_platform
52
48
  end
53
49
 
54
50
  def recent_task_definition_arns
@@ -72,9 +68,10 @@ module EcsDeploy
72
68
  execution_role_arn: @execution_role_arn,
73
69
  requires_compatibilities: @requires_compatibilities,
74
70
  cpu: @cpu, memory: @memory,
75
- tags: @tags
71
+ tags: @tags,
72
+ runtime_platform: @runtime_platform
76
73
  })
77
- EcsDeploy.logger.info "register task definition [#{@task_definition_name}] [#{@region}] [#{Paint['OK', :green]}]"
74
+ EcsDeploy.logger.info "registered task definition [#{@task_definition_name}] [#{@region}] [#{Paint['OK', :green]}]"
78
75
  res.task_definition
79
76
  end
80
77
  end
@@ -1,3 +1,3 @@
1
1
  module EcsDeploy
2
- VERSION = "1.0.4"
2
+ VERSION = "1.0.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecs_deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - joker1007
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-10 00:00:00.000000000 Z
11
+ date: 2024-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-autoscaling
@@ -236,7 +236,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
236
236
  - !ruby/object:Gem::Version
237
237
  version: '0'
238
238
  requirements: []
239
- rubygems_version: 3.4.2
239
+ rubygems_version: 3.5.6
240
240
  signing_key:
241
241
  specification_version: 4
242
242
  summary: AWS ECS deploy helper