-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open AWS storage to being used with non-AWS MySQL and S3 services #428
Changes from all commits
1ea4d83
5546321
83f0f57
07b7d0d
c265a96
224c389
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,8 +30,10 @@ package aws | |
|
||
import ( | ||
"bytes" | ||
"compress/gzip" | ||
"context" | ||
"database/sql" | ||
"encoding/base64" | ||
"encoding/gob" | ||
"errors" | ||
"fmt" | ||
|
@@ -110,6 +112,17 @@ type consumeFunc func(ctx context.Context, from uint64, entries []storage.Sequen | |
|
||
// Config holds AWS project and resource configuration for a storage instance. | ||
type Config struct { | ||
// SDKConfig is an optional AWS config to use when configuring service clients, e.g. to | ||
// use non-AWS S3 or MySQL services. | ||
// | ||
// If nil, the value from config.LoadDefaultConfig() will be used - this is the only | ||
// supported configuration. | ||
SDKConfig *aws.Config | ||
// S3Options is an optional function which can be used to configure the S3 library. | ||
// This is primarily useful when configuring the use of non-AWS S3 or MySQL services. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think that S3Options has no impact on MySQL, right? The comment says otherwise. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Strictly speaking you're right, but intention of the comment is to make it clear that if you're setting these options you're outside of AWS and the supported config; i.e. it's only really useful to use |
||
// | ||
// If nil, the default options will be used - this is the only supported configuration. | ||
S3Options func(*s3.Options) | ||
// Bucket is the name of the S3 bucket to use for storing log state. | ||
Bucket string | ||
// DSN is the DSN of the MySQL instance to use. | ||
|
@@ -133,11 +146,16 @@ func New(ctx context.Context, cfg Config, opts ...func(*options.StorageOptions)) | |
return nil, fmt.Errorf("requested CheckpointInterval (%v) is less than minimum permitted %v", opt.CheckpointInterval, minCheckpointInterval) | ||
} | ||
|
||
sdkConfig, err := config.LoadDefaultConfig(ctx) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to load default AWS configuration: %v", err) | ||
if cfg.SDKConfig == nil { | ||
sdkConfig, err := config.LoadDefaultConfig(ctx) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to load default AWS configuration: %v", err) | ||
} | ||
cfg.SDKConfig = &sdkConfig | ||
} else { | ||
printDragonsWarning() | ||
} | ||
c := s3.NewFromConfig(sdkConfig) | ||
c := s3.NewFromConfig(*cfg.SDKConfig, cfg.S3Options) | ||
|
||
seq, err := newMySQLSequencer(ctx, cfg.DSN, uint64(opt.PushbackMaxOutstanding), cfg.MaxOpenConns, cfg.MaxIdleConns) | ||
if err != nil { | ||
|
@@ -873,3 +891,14 @@ func (s *s3Storage) lastModified(ctx context.Context, obj string) (time.Time, er | |
|
||
return *r.LastModified, r.Body.Close() | ||
} | ||
|
||
func printDragonsWarning() { | ||
d := `H4sIAFZYZGcAA01QMQ7EIAzbeYXV5UCqkq1bf2IFtpNuPalj334hFQdkwLGNAwBzyXnKitOiqTYj | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. <3 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Couldn't pass up the option :) |
||
B7ZGplWEwZhZqxZ1aKuswcD0AA4GXPUhI0MEpSd5Ow09vJ+m6rVtF6m0GDccYXDZEdp9N/g1H9Pf | ||
Qu80vNj7tiOe0lkdc8hwZK9YxavT0+FTP++vU6DUKvpEOr1+VGTk3IBXKSX9AHz5xXRgAQAA` | ||
g, _ := base64.StdEncoding.DecodeString(d) | ||
r, _ := gzip.NewReader(bytes.NewReader(g)) | ||
t, _ := io.ReadAll(r) | ||
klog.Infof("Running in non-AWS mode - see storage/aws/README.md for more details.") | ||
klog.Infof("Here be dragons!\n%s", t) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks to me that this will always set the region to
us-east-1
as soon as someone sets s3Endpoint. That will then setSDKConfig
which means thatLoadDefaultConfig
will be skipped, thus skipping other values that would be in the default config. At the moment, we only useLoadDefaultConfig
for S3 but that might not always be the case, so let's disambiguate this to avoid leaving something to trip on later? Note, that I don't know howLoadDefaultConfig
works with MinIO, but it looks like this might be tricky if someone uses both AWS and the new flags. That should not be done in the first place, but if the code doesn't prevent it (should it?!), then let's make sure there's no abiguity?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That's intentional - the idea here is that you only ever set
--s3_endpoint
if you're going "off-piste" and running outside of AWS, in which case the aws default config no longer applies.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Things I'm thinking of:
LoadDefaultConfig
, which is..... fine because they're off piste?LoadDefaultConfig
is only called for S3, but my plan was to change this such that it can use IAM authentication for MySQL instead of user and password. We might have to reorganise things then, but seems fine to me with the current code.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool, yeah - I think this is only a problem if they want to use "half AWS, half off"(?) which is definitely a non-supported config, so, as you say, probably ok that it doesn't work.
I'm trying to avoid having the amazon SDK "inadvertently" populate the client with AWS credentials, endpoint URLs, or anything else it does "by default" if you're in off-piste mode.