Skip to content

Commit dba82b7

Browse files
authored
Merge pull request #13 from aws-samples/develop
feat: support payer request for none public bucket
2 parents 49f8b14 + 7db14b4 commit dba82b7

8 files changed

Lines changed: 80 additions & 22 deletions

File tree

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ ENV SRC_ENDPOINT ''
2828
ENV SRC_CREDENTIALS ''
2929
ENV SRC_IN_CURRENT_ACCOUNT false
3030
ENV SKIP_COMPARE false
31+
ENV PAYER_REQUEST false
3132

3233
ENV DEST_BUCKET ''
3334
ENV DEST_PREFIX ''

cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ func initConfig() {
9696
viper.BindEnv("srcCredential", "SRC_CREDENTIALS")
9797
viper.BindEnv("srcInCurrentAccount", "SRC_IN_CURRENT_ACCOUNT")
9898
viper.BindEnv("skipCompare", "SKIP_COMPARE")
99+
viper.BindEnv("payerRequest", "PAYER_REQUEST")
99100

100101
viper.BindEnv("destBucket", "DEST_BUCKET")
101102
viper.BindEnv("destPrefix", "DEST_PREFIX")
@@ -155,6 +156,7 @@ func initConfig() {
155156
SrcCredential: viper.GetString("srcCredential"),
156157
SrcInCurrentAccount: viper.GetBool("srcInCurrentAccount"),
157158
SkipCompare: viper.GetBool("skipCompare"),
159+
PayerRequest: viper.GetBool("payerRequest"),
158160
DestBucket: viper.GetString("destBucket"),
159161
DestPrefix: viper.GetString("destPrefix"),
160162
DestRegion: viper.GetString("destRegion"),

config-example.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ srcEndpoint:
66
srcCredential: src
77
srcInCurrentAccount: false
88
skipCompare: false
9+
payerRequest: false
910

1011
destBucket: dest-bucket
1112
destPrefix:

dth/client.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type Client interface {
6060
type S3Client struct {
6161
bucket, prefix, prefixList, region, sourceType string
6262
isSrcClient bool
63+
isPayerRequest bool
6364
client *s3.Client
6465
}
6566

@@ -171,10 +172,22 @@ func (c *S3Client) GetObject(ctx context.Context, key *string, size, start, chun
171172
return nil, nil
172173
}
173174
bodyRange := fmt.Sprintf("bytes=%d-%d", start, start+chunkSize-1)
174-
input := &s3.GetObjectInput{
175-
Bucket: &c.bucket,
176-
Key: key,
177-
Range: &bodyRange,
175+
176+
var input *s3.GetObjectInput
177+
178+
if c.isPayerRequest {
179+
input = &s3.GetObjectInput{
180+
Bucket: &c.bucket,
181+
Key: key,
182+
Range: &bodyRange,
183+
RequestPayer: types.RequestPayerRequester,
184+
}
185+
} else {
186+
input = &s3.GetObjectInput{
187+
Bucket: &c.bucket,
188+
Key: key,
189+
Range: &bodyRange,
190+
}
178191
}
179192

180193
output, err := c.client.GetObject(ctx, input, getClientCredentialsModifyFn(c.isSrcClient, SRC_CRED, DST_CRED))
@@ -199,12 +212,25 @@ func (c *S3Client) GetObject(ctx context.Context, key *string, size, start, chun
199212
// Internal func to call API to list objects.
200213
func (c *S3Client) listObjectFn(ctx context.Context, continuationToken, prefix, delimiter *string, maxKeys int32) (*s3.ListObjectsV2Output, error) {
201214

202-
input := &s3.ListObjectsV2Input{
203-
Bucket: &c.bucket,
204-
Prefix: prefix,
205-
MaxKeys: maxKeys,
206-
Delimiter: delimiter,
207-
EncodingType: "url",
215+
var input *s3.ListObjectsV2Input
216+
217+
if c.isPayerRequest {
218+
input = &s3.ListObjectsV2Input{
219+
Bucket: &c.bucket,
220+
Prefix: prefix,
221+
MaxKeys: maxKeys,
222+
Delimiter: delimiter,
223+
EncodingType: "url",
224+
RequestPayer: types.RequestPayerRequester,
225+
}
226+
} else {
227+
input = &s3.ListObjectsV2Input{
228+
Bucket: &c.bucket,
229+
Prefix: prefix,
230+
MaxKeys: maxKeys,
231+
Delimiter: delimiter,
232+
EncodingType: "url",
233+
}
208234
}
209235

210236
if *continuationToken != "" {

dth/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ type JobConfig struct {
6969
SrcType, SrcBucket, SrcPrefix, SrcPrefixList, SrcRegion, SrcEndpoint, SrcCredential string
7070
DestBucket, DestPrefix, DestRegion, DestCredential, DestStorageClass, DestAcl string
7171
JobTableName, JobQueueName string
72-
SrcInCurrentAccount, DestInCurrentAccount, SkipCompare bool
72+
SrcInCurrentAccount, DestInCurrentAccount, SkipCompare, PayerRequest bool
7373
*JobOptions
7474
}
7575

dth/job.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ func NewFinder(ctx context.Context, cfg *JobConfig) (f *Finder) {
121121
srcClient.isSrcClient = true
122122
}
123123

124+
if cfg.PayerRequest {
125+
srcClient.isPayerRequest = true
126+
}
127+
124128
SRC_CRED = srcCred
125129
DST_CRED = desCred
126130

@@ -183,6 +187,10 @@ func (f *Finder) Run(ctx context.Context) {
183187
var prefixes []*string
184188
log.Printf("Prefix List File: %s", f.cfg.SrcPrefixList)
185189

190+
if f.cfg.PayerRequest {
191+
log.Printf("Enable Payer Request Mode")
192+
}
193+
186194
if len(f.cfg.SrcPrefixList) > 0 {
187195
prefixes = f.srcClient.ListSelectedPrefixes(ctx, &f.cfg.SrcPrefixList)
188196
} else {
@@ -458,6 +466,10 @@ func NewWorker(ctx context.Context, cfg *JobConfig) (w *Worker) {
458466
srcClient.isSrcClient = true
459467
}
460468

469+
if cfg.PayerRequest {
470+
srcClient.isPayerRequest = true
471+
}
472+
461473
SRC_CRED = srcCred
462474
DST_CRED = desCred
463475

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ module golang.a2z.com/dthcli
33
go 1.16
44

55
require (
6-
github.com/aws/aws-sdk-go-v2 v1.8.1
6+
github.com/aws/aws-sdk-go-v2 v1.17.7
77
github.com/aws/aws-sdk-go-v2/config v1.6.1
88
github.com/aws/aws-sdk-go-v2/credentials v1.3.3
99
github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.1.1
1010
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.1
1111
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.3.1
12-
github.com/aws/aws-sdk-go-v2/service/s3 v1.13.0
12+
github.com/aws/aws-sdk-go-v2/service/s3 v1.31.1
1313
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.3.1
1414
github.com/aws/aws-sdk-go-v2/service/sqs v1.4.1
15-
github.com/aws/smithy-go v1.7.0
15+
github.com/aws/smithy-go v1.13.5
1616
github.com/spf13/cobra v1.1.3
1717
github.com/spf13/viper v1.7.1
1818
)

go.sum

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
2121
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
2222
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
2323
github.com/aws/aws-sdk-go-v2 v1.6.0/go.mod h1:tI4KhsR5VkzlUa2DZAdwx7wCAYGwkZZ1H31PYrBFx1w=
24-
github.com/aws/aws-sdk-go-v2 v1.8.1 h1:GcFgQl7MsBygmeeqXyV1ivrTEmsVz/rdFJaTcltG9ag=
2524
github.com/aws/aws-sdk-go-v2 v1.8.1/go.mod h1:xEFuWz+3TYdlPRuo+CqATbeDWIWyaT5uAPwPaWtgse0=
25+
github.com/aws/aws-sdk-go-v2 v1.17.7 h1:CLSjnhJSTSogvqUGhIC6LqFKATMRexcxLZ0i/Nzk9Eg=
26+
github.com/aws/aws-sdk-go-v2 v1.17.7/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
27+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs=
28+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno=
2629
github.com/aws/aws-sdk-go-v2/config v1.6.1 h1:qrZINaORyr78syO1zfD4l7r4tZjy0Z1l0sy4jiysyOM=
2730
github.com/aws/aws-sdk-go-v2/config v1.6.1/go.mod h1:t/y3UPu0XEDy0cEw6mvygaBQaPzWiYAxfP2SzgtvclA=
2831
github.com/aws/aws-sdk-go-v2/credentials v1.3.3 h1:A13QPatmUl41SqUfnuT3V0E3XiNGL6qNTOINbE8cZL4=
@@ -33,21 +36,33 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.4.1 h1:rc+fRGvlKbeSd9IFhFS1KWBs
3336
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.4.1/go.mod h1:+GTydg3uHmVlQdkRoetz6VHKbOMEYof70m19IpMLifc=
3437
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.1 h1:iJMRP1dYMC0FNzPmNKJOEv7ZqyIfQl1H0+1Dpv+z3Bs=
3538
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.4.1/go.mod h1:Ir1Mb3X4bIw0dxJQVW55CdXGlVy+t+I9zZpqPJKjHto=
39+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31 h1:sJLYcS+eZn5EeNINGHSCRAwUJMFVqklwkH36Vbyai7M=
40+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.31/go.mod h1:QT0BqUvX1Bh2ABdTGnjqEjvjzrCfIniM9Sc8zn9Yndo=
41+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25 h1:1mnRASEKnkqsntcxHaysxwgVoUUp5dkiB+l3llKnqyg=
42+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.25/go.mod h1:zBHOPwhBc3FlQjQJE/D3IfPWiWaQmT06Vq9aNukDo0k=
3643
github.com/aws/aws-sdk-go-v2/internal/ini v1.2.1 h1:IkqRRUZTKaS16P2vpX+FNc2jq3JWa3c478gykQp4ow4=
3744
github.com/aws/aws-sdk-go-v2/internal/ini v1.2.1/go.mod h1:Pv3WenDjI0v2Jl7UaMFIIbPOBbhn33RmmAmGgkXDoqY=
45+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23 h1:DWYZIsyqagnWL00f8M/SOr9fN063OEQWn9LLTbdYXsk=
46+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.23/go.mod h1:uIiFgURZbACBEQJfqTZPb/jxO7R+9LeoHUFudtIdeQI=
3847
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.3.1 h1:uAn7miAtNHewvTnGbXOA0dW1yE/3spgq9lB2D3sfpeQ=
3948
github.com/aws/aws-sdk-go-v2/service/dynamodb v1.3.1/go.mod h1:zL1ZppTfOSWcDLRURlZn9w4Wl0jceSBF5PoUXa1amYc=
4049
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.2.1 h1:7qlg0PmBJJoP6LDTNWfAxVuENYscckFSbnT7GrsNRRk=
4150
github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.2.1/go.mod h1:iLSTe7bH0WakfRQ4ga7mhEvrTDwoB1UfXMztiVFBkzQ=
4251
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.1.0/go.mod h1:zdjOOy0ojUn3iNELo6ycIHSMCp4xUbycSHfb8PnbbyM=
43-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.2 h1:YcGVEqLQGHDa81776C3daai6ZkkRGf/8RAQ07hV0QcU=
4452
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.2.2/go.mod h1:EASdTcM1lGhUe1/p4gkojHwlGJkeoRjjr1sRCzup3Is=
45-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.3 h1:VxFCgxsqWe7OThOwJ5IpFX3xrObtuIH9Hg/NW7oot1Y=
53+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA=
54+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8=
55+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26 h1:CeuSeq/8FnYpPtnuIeLQEEvDv9zUjneuYi8EghMBdwQ=
56+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.26/go.mod h1:2UqAAwMUXKeRkAHIlDJqvMVgOWkUi/AUXPk/YIe+Dg4=
4657
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.2.3/go.mod h1:7gcsONBmFoCcKrAqrm95trrMd2+C/ReYKP7Vfu8yHHA=
47-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.3 h1:7tPSbUWzuoMJ2woUKgOfIPuZS88hMdFHJBBB2vR0bHI=
58+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0=
59+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25/go.mod h1:/95IA+0lMnzW6XzqYJRpjjsAbKEORVeO0anQqjd2CNU=
4860
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.5.3/go.mod h1:/ugW3qFkJe/h7sNtI6/zJnwRbvavs6GyOid69uI9eek=
49-
github.com/aws/aws-sdk-go-v2/service/s3 v1.13.0 h1:2oMLrNpOSpkDTocIVv3Fut1XrmlbKPlgnnYMGYqFp0Y=
61+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0 h1:e2ooMhpYGhDnBfSvIyusvAwX7KexuZaHbQY2Dyei7VU=
62+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.0/go.mod h1:bh2E0CXKZsQN+faiKVqC40vfNMAWheoULBCnEgO9K+8=
5063
github.com/aws/aws-sdk-go-v2/service/s3 v1.13.0/go.mod h1:Tzxhu3GnCpj45WJqXyxcLF2gUHzTcmY7CzpQ9x9KVls=
64+
github.com/aws/aws-sdk-go-v2/service/s3 v1.31.1 h1:PJH4I+qYjPXclKRbVCW47iYUvtXEh1u6YmDhn5J8VQE=
65+
github.com/aws/aws-sdk-go-v2/service/s3 v1.31.1/go.mod h1:ncltU6n4Nof5uJttDtcNQ537uNuwYqsZZQcpkd2/GUQ=
5166
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.3.1 h1:atHdsCczZyM/y9QIoCQnxudoKk8+ya2EPIplDOofkjw=
5267
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.3.1/go.mod h1:ayQUSrG5QyIl2jRSB0YnoJ1e9swNxsBWaCK3hNI2caI=
5368
github.com/aws/aws-sdk-go-v2/service/sqs v1.4.1 h1:BBW0EAZrJh3pesbs9m7ghgC8kylLjTPmWN3yG7POjnA=
@@ -57,8 +72,9 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.3.3/go.mod h1:Jgw5O+SK7MZ2Yi9Yvzb4Pg
5772
github.com/aws/aws-sdk-go-v2/service/sts v1.6.2 h1:l504GWCoQi1Pk68vSUFGLmDIEMzRfVGNgLakDK+Uj58=
5873
github.com/aws/aws-sdk-go-v2/service/sts v1.6.2/go.mod h1:RBhoMJB8yFToaCnbe0jNq5Dcdy0jp6LhHqg55rjClkM=
5974
github.com/aws/smithy-go v1.4.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
60-
github.com/aws/smithy-go v1.7.0 h1:+cLHMRrDZvQ4wk+KuQ9yH6eEg6KZEJ9RI2IkDqnygCg=
6175
github.com/aws/smithy-go v1.7.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
76+
github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8=
77+
github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
6278
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
6379
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
6480
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
@@ -100,8 +116,9 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
100116
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
101117
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
102118
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
103-
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
104119
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
120+
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
121+
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
105122
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
106123
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
107124
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -317,7 +334,6 @@ golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtn
317334
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
318335
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
319336
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
320-
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
321337
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
322338
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
323339
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=

0 commit comments

Comments
 (0)