code: func ServeTaskHTTPEndpoint(credentialsManager credentials.Manager,
  	state dockerstate.TaskEngineState,
  	ecsClient api.ECSClient,
  	containerInstanceArn string,
  	cfg *config.Config,
  	statsEngine stats.Engine,
  	availabilityZone string) {
  	// Create and initialize the audit log
  	// TODO Use seelog's programmatic configuration instead of xml.
  	logger, err := seelog.LoggerFromConfigAsString(audit.AuditLoggerConfig(cfg))
  	if err != nil {
  		seelog.Errorf("Error initializing the audit log: %v", err)
  		// If the logger cannot be initialized, use the provided dummy seelog.LoggerInterface, seelog.Disabled.
  		logger = seelog.Disabled
  	}
  
  	auditLogger := audit.NewAuditLog(containerInstanceArn, cfg, logger)
  
  	server := taskServerSetup(credentialsManager, auditLogger, state, ecsClient, cfg.Cluster, statsEngine,
  		cfg.TaskMetadataSteadyStateRate, cfg.TaskMetadataBurstRate, availabilityZone, containerInstanceArn)
  
  	for {
  		retry.RetryWithBackoff(retry.NewExponentialBackoff(time.Second, time.Minute, 0.2, 2), func() error {
  			// TODO, make this cancellable and use the passed in context;
  			err := server.ListenAndServe()
  			if err != nil {
  				seelog.Errorf("Error running http api: %v", err)
  			}
  			return err
  		})
  	}
  }
docs: // ServeTaskHTTPEndpoint serves task/container metadata, task/container stats, and IAM Role Credentials
  // for tasks being managed by the agent.