func (agent *ecsAgent) registerContainerInstance(
	stateManager statemanager.StateManager,
	client api.ECSClient,
	additionalAttributes []*ecs.Attribute) error {
	// Preflight request to make sure they're good
	if preflightCreds, err := agent.credentialProvider.Get(); err != nil || preflightCreds.AccessKeyID == "" {
		seelog.Warnf("Error getting valid credentials (AKID %s): %v", preflightCreds.AccessKeyID, err)
	}

	agentCapabilities, err := agent.capabilities()
	if err != nil {
		return err
	}
	capabilities := append(agentCapabilities, additionalAttributes...)

	// Get the tags of this container instance defined in config file
	tags := utils.MapToTags(agent.cfg.ContainerInstanceTags)
	if agent.cfg.ContainerInstancePropagateTagsFrom == config.ContainerInstancePropagateTagsFromEC2InstanceType {
		ec2Tags, err := agent.getContainerInstanceTagsFromEC2API()
		// If we are unable to call the API, we should not treat it as a transient error,
		// because we've already retried several times, we may throttle the API if we
		// keep retrying.
		if err != nil {
			return err
		}
		seelog.Infof("Retrieved Tags from EC2 DescribeTags API:\n%v", ec2Tags)
		tags = mergeTags(tags, ec2Tags)
	}

	platformDevices := agent.getPlatformDevices()

	if agent.containerInstanceARN != "" {
		seelog.Infof("Restored from checkpoint file. I am running as '%s' in cluster '%s'", agent.containerInstanceARN, agent.cfg.Cluster)
		return agent.reregisterContainerInstance(client, capabilities, tags, uuid.New(), platformDevices)
	}

	seelog.Info("Registering Instance with ECS")
	containerInstanceArn, availabilityZone, err := client.RegisterContainerInstance("", capabilities, tags, uuid.New(), platformDevices)
	if err != nil {
		seelog.Errorf("Error registering: %v", err)
		if retriable, ok := err.(apierrors.Retriable); ok && !retriable.Retry() {
			return err
		}
		if utils.IsAWSErrorCodeEqual(err, ecs.ErrCodeInvalidParameterException) {
			seelog.Critical("Instance registration attempt with an invalid parameter")
			return err
		}
		if _, ok := err.(apierrors.AttributeError); ok {
			seelog.Critical("Instance registration attempt with an invalid attribute")
			return err
		}
		return transientError{err}
	}
	seelog.Infof("Registration completed successfully. I am running as '%s' in cluster '%s'", containerInstanceArn, agent.cfg.Cluster)
	agent.containerInstanceARN = containerInstanceArn
	agent.availabilityZone = availabilityZone
	// Save our shiny new containerInstanceArn
	stateManager.Save()
	return nil
}
func (agent *ecsAgent) registerContainerInstance(
	stateManager statemanager.StateManager,
	client api.ECSClient,
	additionalAttributes []*ecs.Attribute) error {
	
	if preflightCreds, err := agent.credentialProvider.Get(); err != nil || preflightCreds.AccessKeyID == "" {
		seelog.Warnf("Error getting valid credentials (AKID %s): %v", preflightCreds.AccessKeyID, err)
	}

	agentCapabilities, err := agent.capabilities()
	if err != nil {
		return err
	}
	capabilities := append(agentCapabilities, additionalAttributes...)

	
	tags := utils.MapToTags(agent.cfg.ContainerInstanceTags)
	if agent.cfg.ContainerInstancePropagateTagsFrom == config.ContainerInstancePropagateTagsFromEC2InstanceType {
		ec2Tags, err := agent.getContainerInstanceTagsFromEC2API()
		
		
		
		if err != nil {
			return err
		}
		seelog.Infof("Retrieved Tags from EC2 DescribeTags API:\n%v", ec2Tags)
		tags = mergeTags(tags, ec2Tags)
	}

	platformDevices := agent.getPlatformDevices()

	if agent.containerInstanceARN != "" {
		seelog.Infof("Restored from checkpoint file. I am running as '%s' in cluster '%s'", agent.containerInstanceARN, agent.cfg.Cluster)
		return agent.reregisterContainerInstance(client, capabilities, tags, uuid.New(), platformDevices)
	}

	seelog.Info("Registering Instance with ECS")
	containerInstanceArn, availabilityZone, err := client.RegisterContainerInstance("", capabilities, tags, uuid.New(), platformDevices)
	if err != nil {
		seelog.Errorf("Error registering: %v", err)
		if retriable, ok := err.(apierrors.Retriable); ok && !retriable.Retry() {
			return err
		}
		if utils.IsAWSErrorCodeEqual(err, ecs.ErrCodeInvalidParameterException) {
			seelog.Critical("Instance registration attempt with an invalid parameter")
			return err
		}
		if _, ok := err.(apierrors.AttributeError); ok {
			seelog.Critical("Instance registration attempt with an invalid attribute")
			return err
		}
		return transientError{err}
	}
	seelog.Infof("Registration completed successfully. I am running as '%s' in cluster '%s'", containerInstanceArn, agent.cfg.Cluster)
	agent.containerInstanceARN = containerInstanceArn
	agent.availabilityZone = availabilityZone
	
	stateManager.Save()
	return nil
}
func ( agent * ecsAgent ) registerContainerInstance ( stateManager statemanager . StateManager , client api . ECSClient , additionalAttributes [ ] * ecs . Attribute ) error { // Preflight request to make sure they're good if preflightCreds , err := agent . credentialProvider . Get ( ) ; err != nil || preflightCreds . AccessKeyID == " " { seelog . Warnf ( " " , preflightCreds . AccessKeyID , err ) } agentCapabilities , err := agent . capabilities ( ) if err != nil { return err } capabilities := append ( agentCapabilities , additionalAttributes ... ) // Get the tags of this container instance defined in config file tags := utils . MapToTags ( agent . cfg . ContainerInstanceTags ) if agent . cfg . ContainerInstancePropagateTagsFrom == config . ContainerInstancePropagateTagsFromEC2InstanceType { ec2Tags , err := agent . getContainerInstanceTagsFromEC2API ( ) // If we are unable to call the API, we should not treat it as a transient error, // because we've already retried several times, we may throttle the API if we // keep retrying. if err != nil { return err } seelog . Infof ( " \n " , ec2Tags ) tags = mergeTags ( tags , ec2Tags ) } platformDevices := agent . getPlatformDevices ( ) if agent . containerInstanceARN != " " { seelog . Infof ( " " , agent . containerInstanceARN , agent . cfg . Cluster ) return agent . reregisterContainerInstance ( client , capabilities , tags , uuid . New ( ) , platformDevices ) } seelog . Info ( " " ) containerInstanceArn , availabilityZone , err := client . RegisterContainerInstance ( " " , capabilities , tags , uuid . New ( ) , platformDevices ) if err != nil { seelog . Errorf ( " " , err ) if retriable , ok := err . ( apierrors . Retriable ) ; ok && ! retriable . Retry ( ) { return err } if utils . IsAWSErrorCodeEqual ( err , ecs . ErrCodeInvalidParameterException ) { seelog . Critical ( " " ) return err } if _ , ok := err . ( apierrors . AttributeError ) ; ok { seelog . Critical ( " " ) return err } return transientError { err } } seelog . Infof ( " " , containerInstanceArn , agent . cfg . Cluster ) agent . containerInstanceARN = containerInstanceArn agent . availabilityZone = availabilityZone // Save our shiny new containerInstanceArn stateManager . Save ( ) return nil }
// registerContainerInstance registers the container instance ID for the ECS Agent
registerContainerInstance registers the container instance ID for the ECS Agent