func (o *S3Behavior) Initialize(connString string) error { // bucketName can either be a single value (just the bucket name itself, defaulting to "/var/cb/data/event-forwarder" as the // temporary file directory and "us-east-1" for the AWS region), or: // // if bucketName contains two colons, treat it as follows: (temp-file-directory):(region):(bucket-name) parts := strings.SplitN(connString, ":", 2) if len(parts) == 1 { o.bucketName = connString o.region = "us-east-1" } else if len(parts) == 2 { o.bucketName = parts[1] o.region = parts[0] } else { return errors.New(fmt.Sprintf("Invalid connection string: '%s' should look like (temp-file-directory):(region):bucket-name", connString)) } awsConfig := &aws.Config{Region: aws.String(o.region)} if config.S3CredentialProfileName != nil { parts = strings.SplitN(*config.S3CredentialProfileName, ":", 2) credentialProvider := credentials.SharedCredentialsProvider{} if len(parts) == 2 { credentialProvider.Filename = parts[0] credentialProvider.Profile = parts[1] } else { credentialProvider.Profile = parts[0] } creds := credentials.NewCredentials(&credentialProvider) awsConfig.Credentials = creds } sess := session.New(awsConfig) o.out = s3.New(sess) _, err := o.out.HeadBucket(&s3.HeadBucketInput{Bucket: &o.bucketName}) if err != nil { return errors.New(fmt.Sprintf("Could not open bucket %s: %s", o.bucketName, err)) } return nil }
func (o *S3Output) Initialize(connString string) error { o.fileResultChan = make(chan UploadStatus) o.filesToUpload = make([]string, 0) // maximum file size before we trigger an upload is ~10MB. o.maxFileSize = 10 * 1024 * 1024 // roll over duration defaults to five minutes o.rollOverDuration = 5 * time.Minute // bucketName can either be a single value (just the bucket name itself, defaulting to "/var/cb/data/event-forwarder" as the // temporary file directory and "us-east-1" for the AWS region), or: // // if bucketName contains two colons, treat it as follows: (temp-file-directory):(region):(bucket-name) parts := strings.SplitN(connString, ":", 3) if len(parts) == 1 { o.bucketName = connString o.tempFileDirectory = "/var/cb/data/event-forwarder" o.region = "us-east-1" } else if len(parts) == 3 { o.bucketName = parts[2] o.tempFileDirectory = parts[0] o.region = parts[1] } else { return errors.New(fmt.Sprintf("Invalid connection string: '%s' should look like (temp-file-directory):(region):(bucket-name)", connString)) } awsConfig := &aws.Config{Region: aws.String(o.region)} if config.S3CredentialProfileName != nil { parts = strings.SplitN(*config.S3CredentialProfileName, ":", 2) credentialProvider := credentials.SharedCredentialsProvider{} if len(parts) == 2 { credentialProvider.Filename = parts[0] credentialProvider.Profile = parts[1] } else { credentialProvider.Profile = parts[0] } creds := credentials.NewCredentials(&credentialProvider) awsConfig.Credentials = creds } sess := session.New(awsConfig) o.out = s3.New(sess) _, err := o.out.HeadBucket(&s3.HeadBucketInput{Bucket: &o.bucketName}) if err != nil { return errors.New(fmt.Sprintf("Could not open bucket %s: %s", o.bucketName, err)) } if err = os.MkdirAll(o.tempFileDirectory, 0700); err != nil { return err } currentPath := filepath.Join(o.tempFileDirectory, "event-forwarder") o.tempFileOutput = &FileOutput{} err = o.tempFileOutput.Initialize(currentPath) // find files in the output directory that haven't been uploaded yet and add them to the list // we ignore any errors that may occur during this process o.queueStragglers() return err }