in agent/app/agent.go [139:220]
func newAgent(blackholeEC2Metadata bool, acceptInsecureCert *bool) (agent, error) {
ctx, cancel := context.WithCancel(context.Background())
ec2MetadataClient := ec2.NewEC2MetadataClient(nil)
if blackholeEC2Metadata {
ec2MetadataClient = ec2.NewBlackholeEC2MetadataClient()
}
seelog.Info("Loading configuration")
cfg, err := config.NewConfig(ec2MetadataClient)
if err != nil {
// All required config values can be inferred from EC2 Metadata,
// so this error could be transient.
seelog.Criticalf("Error loading config: %v", err)
cancel()
return nil, err
}
cfg.AcceptInsecureCert = aws.BoolValue(acceptInsecureCert)
if cfg.AcceptInsecureCert {
seelog.Warn("SSL certificate verification disabled. This is not recommended.")
}
seelog.Infof("Amazon ECS agent Version: %s, Commit: %s", version.Version, version.GitShortHash)
seelog.Debugf("Loaded config: %s", cfg.String())
if cfg.External.Enabled() {
seelog.Info("Running in external mode.")
ec2MetadataClient = ec2.NewBlackholeEC2MetadataClient()
cfg.NoIID = true
}
ec2Client := ec2.NewClientImpl(cfg.AWSRegion)
dockerClient, err := dockerapi.NewDockerGoClient(sdkclientfactory.NewFactory(ctx, cfg.DockerEndpoint), cfg, ctx)
if err != nil {
// This is also non terminal in the current config
seelog.Criticalf("Error creating Docker client: %v", err)
cancel()
return nil, err
}
var dataClient data.Client
if cfg.Checkpoint.Enabled() {
dataClient, err = data.New(cfg.DataDir)
if err != nil {
seelog.Criticalf("Error creating data client: %v", err)
cancel()
return nil, err
}
} else {
dataClient = data.NewNoopClient()
}
var metadataManager containermetadata.Manager
if cfg.ContainerMetadataEnabled.Enabled() {
// We use the default API client for the metadata inspect call. This version has some information
// missing which means if we need those fields later we will need to change this client to
// the appropriate version
metadataManager = containermetadata.NewManager(dockerClient, cfg)
}
initialSeqNumber := int64(-1)
return &ecsAgent{
ctx: ctx,
cancel: cancel,
ec2MetadataClient: ec2MetadataClient,
ec2Client: ec2Client,
cfg: cfg,
dockerClient: dockerClient,
dataClient: dataClient,
// We instantiate our own credentialProvider for use in acs/tcs. This tries
// to mimic roughly the way it's instantiated by the SDK for a default
// session.
credentialProvider: instancecreds.GetCredentials(),
stateManagerFactory: factory.NewStateManager(),
saveableOptionFactory: factory.NewSaveableOption(),
pauseLoader: pause.New(),
cniClient: ecscni.NewClient(cfg.CNIPluginsPath),
metadataManager: metadataManager,
terminationHandler: sighandlers.StartDefaultTerminationHandler,
mobyPlugins: mobypkgwrapper.NewPlugins(),
latestSeqNumberTaskManifest: &initialSeqNumber,
}, nil
}