aws-sdk-go-v2/service/ecs/api_op_UpdateService.go (145 lines of code) (raw):
// Code generated by smithy-go-codegen DO NOT EDIT.
package ecs
import (
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
"context"
"fmt"
"github.com/aws/smithy-go/middleware"
smithyhttp "github.com/aws/smithy-go/transport/http"
"github.com/aws/aws-sdk-go-v2/service/ecs/types"
)
// Modifies the parameters of a service.
//
// On March 21, 2024, a change was made to resolve the task definition revision
// before authorization. When a task definition revision is not specified,
// authorization will occur using the latest revision of a task definition.
//
// For services using the rolling update ( ECS ) you can update the desired count,
// deployment configuration, network configuration, load balancers, service
// registries, enable ECS managed tags option, propagate tags option, task
// placement constraints and strategies, and task definition. When you update any
// of these parameters, Amazon ECS starts new tasks with the new configuration.
//
// You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume
// when starting or running a task, or when creating or updating a service. For
// more infomation, see [Amazon EBS volumes]in the Amazon Elastic Container Service Developer Guide.
// You can update your volume configurations and trigger a new deployment.
// volumeConfigurations is only supported for REPLICA service and not DAEMON
// service. If you leave volumeConfigurations null , it doesn't trigger a new
// deployment. For more infomation on volumes, see [Amazon EBS volumes]in the Amazon Elastic Container
// Service Developer Guide.
//
// For services using the blue/green ( CODE_DEPLOY ) deployment controller, only
// the desired count, deployment configuration, health check grace period, task
// placement constraints and strategies, enable ECS managed tags option, and
// propagate tags can be updated using this API. If the network configuration,
// platform version, task definition, or load balancer need to be updated, create a
// new CodeDeploy deployment. For more information, see [CreateDeployment]in the CodeDeploy API
// Reference.
//
// For services using an external deployment controller, you can update only the
// desired count, task placement constraints and strategies, health check grace
// period, enable ECS managed tags option, and propagate tags option, using this
// API. If the launch type, load balancer, network configuration, platform version,
// or task definition need to be updated, create a new task set For more
// information, see [CreateTaskSet].
//
// You can add to or subtract from the number of instantiations of a task
// definition in a service by specifying the cluster that the service is running in
// and a new desiredCount parameter.
//
// You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume
// when starting or running a task, or when creating or updating a service. For
// more infomation, see [Amazon EBS volumes]in the Amazon Elastic Container Service Developer Guide.
//
// If you have updated the container image of your application, you can create a
// new task definition with that image and deploy it to your service. The service
// scheduler uses the minimum healthy percent and maximum percent parameters (in
// the service's deployment configuration) to determine the deployment strategy.
//
// If your updated Docker image uses the same tag as what is in the existing task
// definition for your service (for example, my_image:latest ), you don't need to
// create a new revision of your task definition. You can update the service using
// the forceNewDeployment option. The new tasks launched by the deployment pull
// the current image/tag combination from your repository when they start.
//
// You can also update the deployment configuration of a service. When a
// deployment is triggered by updating the task definition of a service, the
// service scheduler uses the deployment configuration parameters,
// minimumHealthyPercent and maximumPercent , to determine the deployment strategy.
//
// - If minimumHealthyPercent is below 100%, the scheduler can ignore
// desiredCount temporarily during a deployment. For example, if desiredCount is
// four tasks, a minimum of 50% allows the scheduler to stop two existing tasks
// before starting two new tasks. Tasks for services that don't use a load balancer
// are considered healthy if they're in the RUNNING state. Tasks for services
// that use a load balancer are considered healthy if they're in the RUNNING
// state and are reported as healthy by the load balancer.
//
// - The maximumPercent parameter represents an upper limit on the number of
// running tasks during a deployment. You can use it to define the deployment batch
// size. For example, if desiredCount is four tasks, a maximum of 200% starts
// four new tasks before stopping the four older tasks (provided that the cluster
// resources required to do this are available).
//
// When [UpdateService] stops a task during a deployment, the equivalent of docker stop is issued
// to the containers running in the task. This results in a SIGTERM and a
// 30-second timeout. After this, SIGKILL is sent and the containers are forcibly
// stopped. If the container handles the SIGTERM gracefully and exits within 30
// seconds from receiving it, no SIGKILL is sent.
//
// When the service scheduler launches new tasks, it determines task placement in
// your cluster with the following logic.
//
// - Determine which of the container instances in your cluster can support your
// service's task definition. For example, they have the required CPU, memory,
// ports, and container instance attributes.
//
// - By default, the service scheduler attempts to balance tasks across
// Availability Zones in this manner even though you can choose a different
// placement strategy.
//
// - Sort the valid container instances by the fewest number of running tasks
// for this service in the same Availability Zone as the instance. For example, if
// zone A has one running service task and zones B and C each have zero, valid
// container instances in either zone B or C are considered optimal for placement.
//
// - Place the new service task on a valid container instance in an optimal
// Availability Zone (based on the previous steps), favoring container instances
// with the fewest number of running tasks for this service.
//
// When the service scheduler stops running tasks, it attempts to maintain balance
// across the Availability Zones in your cluster using the following logic:
//
// - Sort the container instances by the largest number of running tasks for
// this service in the same Availability Zone as the instance. For example, if zone
// A has one running service task and zones B and C each have two, container
// instances in either zone B or C are considered optimal for termination.
//
// - Stop the task on a container instance in an optimal Availability Zone
// (based on the previous steps), favoring container instances with the largest
// number of running tasks for this service.
//
// You must have a service-linked role when you update any of the following
// service properties:
//
// - loadBalancers ,
//
// - serviceRegistries
//
// For more information about the role see the CreateService request parameter [role]role
// .
//
// [role]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html#ECS-CreateService-request-role
// [CreateTaskSet]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html
// [UpdateService]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html
// [Amazon EBS volumes]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types
// [CreateDeployment]: https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html
func (c *Client) UpdateService(ctx context.Context, params *UpdateServiceInput, optFns ...func(*Options)) (*UpdateServiceOutput, error) {
if params == nil { params = &UpdateServiceInput{} }
result, metadata, err := c.invokeOperation(ctx, "UpdateService", params, optFns, c.addOperationUpdateServiceMiddlewares)
if err != nil { return nil, err }
out := result.(*UpdateServiceOutput)
out.ResultMetadata = metadata
return out, nil
}
type UpdateServiceInput struct {
// The name of the service to update.
//
// This member is required.
Service *string
// The capacity provider strategy to update the service to use.
//
// if the service uses the default capacity provider strategy for the cluster, the
// service can be updated to use one or more capacity providers as opposed to the
// default capacity provider strategy. However, when a service is using a capacity
// provider strategy that's not the default capacity provider strategy, the service
// can't be updated to use the cluster's default capacity provider strategy.
//
// A capacity provider strategy consists of one or more capacity providers along
// with the base and weight to assign to them. A capacity provider must be
// associated with the cluster to be used in a capacity provider strategy. The [PutClusterCapacityProviders]API
// is used to associate a capacity provider with a cluster. Only capacity providers
// with an ACTIVE or UPDATING status can be used.
//
// If specifying a capacity provider that uses an Auto Scaling group, the capacity
// provider must already be created. New capacity providers can be created with the
// [CreateClusterCapacityProvider]API operation.
//
// To use a Fargate capacity provider, specify either the FARGATE or FARGATE_SPOT
// capacity providers. The Fargate capacity providers are available to all accounts
// and only need to be associated with a cluster to be used.
//
// The [PutClusterCapacityProviders]API operation is used to update the list of available capacity providers
// for a cluster after the cluster is created.
//
// [PutClusterCapacityProviders]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html
// [CreateClusterCapacityProvider]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateClusterCapacityProvider.html
CapacityProviderStrategy []types.CapacityProviderStrategyItem
// The short name or full Amazon Resource Name (ARN) of the cluster that your
// service runs on. If you do not specify a cluster, the default cluster is
// assumed.
Cluster *string
// Optional deployment parameters that control how many tasks run during the
// deployment and the ordering of stopping and starting tasks.
DeploymentConfiguration *types.DeploymentConfiguration
// The number of instantiations of the task to place and keep running in your
// service.
DesiredCount *int32
// Determines whether to turn on Amazon ECS managed tags for the tasks in the
// service. For more information, see [Tagging Your Amazon ECS Resources]in the Amazon Elastic Container Service
// Developer Guide.
//
// Only tasks launched after the update will reflect the update. To update the
// tags on all tasks, set forceNewDeployment to true , so that Amazon ECS starts
// new tasks with the updated tags.
//
// [Tagging Your Amazon ECS Resources]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html
EnableECSManagedTags *bool
// If true , this enables execute command functionality on all task containers.
//
// If you do not want to override the value that was set when the service was
// created, you can set this to null when performing this action.
EnableExecuteCommand *bool
// Determines whether to force a new deployment of the service. By default,
// deployments aren't forced. You can use this option to start a new deployment
// with no service definition changes. For example, you can update a service's
// tasks to use a newer Docker image with the same image/tag combination (
// my_image:latest ) or to roll Fargate tasks onto a newer platform version.
ForceNewDeployment bool
// The period of time, in seconds, that the Amazon ECS service scheduler ignores
// unhealthy Elastic Load Balancing target health checks after a task has first
// started. This is only valid if your service is configured to use a load
// balancer. If your service's tasks take a while to start and respond to Elastic
// Load Balancing health checks, you can specify a health check grace period of up
// to 2,147,483,647 seconds. During that time, the Amazon ECS service scheduler
// ignores the Elastic Load Balancing health check status. This grace period can
// prevent the ECS service scheduler from marking tasks as unhealthy and stopping
// them before they have time to come up.
HealthCheckGracePeriodSeconds *int32
// A list of Elastic Load Balancing load balancer objects. It contains the load
// balancer name, the container name, and the container port to access from the
// load balancer. The container name is as it appears in a container definition.
//
// When you add, update, or remove a load balancer configuration, Amazon ECS
// starts new tasks with the updated Elastic Load Balancing configuration, and then
// stops the old tasks when the new tasks are running.
//
// For services that use rolling updates, you can add, update, or remove Elastic
// Load Balancing target groups. You can update from a single target group to
// multiple target groups and from multiple target groups to a single target group.
//
// For services that use blue/green deployments, you can update Elastic Load
// Balancing target groups by using [CreateDeployment]through CodeDeploy. Note that multiple target
// groups are not supported for blue/green deployments. For more information see [Register multiple target groups with a service]
// in the Amazon Elastic Container Service Developer Guide.
//
// For services that use the external deployment controller, you can add, update,
// or remove load balancers by using [CreateTaskSet]. Note that multiple target groups are not
// supported for external deployments. For more information see [Register multiple target groups with a service]in the Amazon
// Elastic Container Service Developer Guide.
//
// You can remove existing loadBalancers by passing an empty list.
//
// [CreateTaskSet]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html
// [Register multiple target groups with a service]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html
// [CreateDeployment]: https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html
LoadBalancers []types.LoadBalancer
// An object representing the network configuration for the service.
NetworkConfiguration *types.NetworkConfiguration
// An array of task placement constraint objects to update the service to use. If
// no value is specified, the existing placement constraints for the service will
// remain unchanged. If this value is specified, it will override any existing
// placement constraints defined for the service. To remove all existing placement
// constraints, specify an empty array.
//
// You can specify a maximum of 10 constraints for each task. This limit includes
// constraints in the task definition and those specified at runtime.
PlacementConstraints []types.PlacementConstraint
// The task placement strategy objects to update the service to use. If no value
// is specified, the existing placement strategy for the service will remain
// unchanged. If this value is specified, it will override the existing placement
// strategy defined for the service. To remove an existing placement strategy,
// specify an empty object.
//
// You can specify a maximum of five strategy rules for each service.
PlacementStrategy []types.PlacementStrategy
// The platform version that your tasks in the service run on. A platform version
// is only specified for tasks using the Fargate launch type. If a platform version
// is not specified, the LATEST platform version is used. For more information,
// see [Fargate Platform Versions]in the Amazon Elastic Container Service Developer Guide.
//
// [Fargate Platform Versions]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html
PlatformVersion *string
// Determines whether to propagate the tags from the task definition or the
// service to the task. If no value is specified, the tags aren't propagated.
//
// Only tasks launched after the update will reflect the update. To update the
// tags on all tasks, set forceNewDeployment to true , so that Amazon ECS starts
// new tasks with the updated tags.
PropagateTags types.PropagateTags
// The configuration for this service to discover and connect to services, and be
// discovered by, and connected from, other services within a namespace.
//
// Tasks that run in a namespace can use short names to connect to services in the
// namespace. Tasks can connect to services across all of the clusters in the
// namespace. Tasks connect through a managed proxy container that collects logs
// and metrics for increased visibility. Only the tasks that Amazon ECS services
// create are supported with Service Connect. For more information, see [Service Connect]in the
// Amazon Elastic Container Service Developer Guide.
//
// [Service Connect]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html
ServiceConnectConfiguration *types.ServiceConnectConfiguration
// The details for the service discovery registries to assign to this service. For
// more information, see [Service Discovery].
//
// When you add, update, or remove the service registries configuration, Amazon
// ECS starts new tasks with the updated service registries configuration, and then
// stops the old tasks when the new tasks are running.
//
// You can remove existing serviceRegistries by passing an empty list.
//
// [Service Discovery]: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html
ServiceRegistries []types.ServiceRegistry
// The family and revision ( family:revision ) or full ARN of the task definition
// to run in your service. If a revision is not specified, the latest ACTIVE
// revision is used. If you modify the task definition with UpdateService , Amazon
// ECS spawns a task with the new version of the task definition and then stops an
// old task after the new version is running.
TaskDefinition *string
// The details of the volume that was configuredAtLaunch . You can configure the
// size, volumeType, IOPS, throughput, snapshot and encryption in [ServiceManagedEBSVolumeConfiguration]. The name of
// the volume must match the name from the task definition. If set to null, no new
// deployment is triggered. Otherwise, if this configuration differs from the
// existing one, it triggers a new deployment.
//
// [ServiceManagedEBSVolumeConfiguration]: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceManagedEBSVolumeConfiguration.html
VolumeConfigurations []types.ServiceVolumeConfiguration
noSmithyDocumentSerde
}
type UpdateServiceOutput struct {
// The full description of your service following the update call.
Service *types.Service
// Metadata pertaining to the operation's result.
ResultMetadata middleware.Metadata
noSmithyDocumentSerde
}
func (c *Client) addOperationUpdateServiceMiddlewares(stack *middleware.Stack, options Options) (err error) {
if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {
return err
}
err = stack.Serialize.Add(&awsAwsjson11_serializeOpUpdateService{}, middleware.After)
if err != nil { return err }
err = stack.Deserialize.Add(&awsAwsjson11_deserializeOpUpdateService{}, middleware.After)
if err != nil { return err }
if err := addProtocolFinalizerMiddlewares(stack, options, "UpdateService"); err != nil {
return fmt.Errorf("add protocol finalizers: %v", err)
}
if err = addlegacyEndpointContextSetter(stack, options); err != nil {
return err
}
if err = addSetLoggerMiddleware(stack, options); err != nil {
return err
}
if err = addClientRequestID(stack); err != nil {
return err
}
if err = addComputeContentLength(stack); err != nil {
return err
}
if err = addResolveEndpointMiddleware(stack, options); err != nil {
return err
}
if err = addComputePayloadSHA256(stack); err != nil {
return err
}
if err = addRetry(stack, options); err != nil {
return err
}
if err = addRawResponseToMetadata(stack); err != nil {
return err
}
if err = addRecordResponseTiming(stack); err != nil {
return err
}
if err = addSpanRetryLoop(stack, options); err != nil {
return err
}
if err = addClientUserAgent(stack, options); err != nil {
return err
}
if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
return err
}
if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
return err
}
if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {
return err
}
if err = addTimeOffsetBuild(stack, c); err != nil {
return err
}
if err = addUserAgentRetryMode(stack, options); err != nil {
return err
}
if err = addOpUpdateServiceValidationMiddleware(stack); err != nil {
return err
}
if err = stack.Initialize.Add(newServiceMetadataMiddleware_opUpdateService(options.Region, ), middleware.Before); err != nil {
return err
}
if err = addRecursionDetection(stack); err != nil {
return err
}
if err = addRequestIDRetrieverMiddleware(stack); err != nil {
return err
}
if err = addResponseErrorMiddleware(stack); err != nil {
return err
}
if err = addRequestResponseLogging(stack, options); err != nil {
return err
}
if err = addDisableHTTPSMiddleware(stack, options); err != nil {
return err
}
if err = addSpanInitializeStart(stack); err != nil {
return err
}
if err = addSpanInitializeEnd(stack); err != nil {
return err
}
if err = addSpanBuildRequestStart(stack); err != nil {
return err
}
if err = addSpanBuildRequestEnd(stack); err != nil {
return err
}
return nil
}
func newServiceMetadataMiddleware_opUpdateService(region string) *awsmiddleware.RegisterServiceMetadata {
return &awsmiddleware.RegisterServiceMetadata{
Region: region,
ServiceID: ServiceID,
OperationName: "UpdateService",
}
}