|
14 | 14 | import software.amazon.awssdk.core.ResponseBytes;
|
15 | 15 | import software.amazon.awssdk.core.sync.RequestBody;
|
16 | 16 | import software.amazon.awssdk.core.sync.ResponseTransformer;
|
| 17 | +import software.amazon.awssdk.regions.Region; |
17 | 18 | import software.amazon.awssdk.services.s3.S3Client;
|
18 | 19 | import software.amazon.awssdk.services.s3.model.*;
|
19 | 20 |
|
20 | 21 | import java.io.IOException;
|
| 22 | +import java.net.URI; |
21 | 23 | import java.nio.charset.StandardCharsets;
|
22 | 24 | import java.util.Map;
|
23 | 25 | import java.util.Optional;
|
|
26 | 28 | public class AmazonS3InstallationService implements InstallationService {
|
27 | 29 |
|
28 | 30 | private final String bucketName;
|
29 |
| - private AwsCredentialsProvider credentialsProvider; |
| 31 | + |
| 32 | + private final AwsCredentialsProvider credentialsProvider; |
| 33 | + private final Region region; |
| 34 | + private final URI endpointOverride; |
| 35 | + |
30 | 36 | private boolean historicalDataEnabled;
|
31 | 37 |
|
32 | 38 | public AmazonS3InstallationService(String bucketName) {
|
33 |
| - this(bucketName, null); |
| 39 | + this(bucketName, DefaultCredentialsProvider.create(), null, null); |
34 | 40 | }
|
35 | 41 |
|
36 | 42 | public AmazonS3InstallationService(String bucketName, AwsCredentialsProvider credentialsProvider) {
|
| 43 | + this(bucketName, credentialsProvider, null, null); |
| 44 | + } |
| 45 | + |
| 46 | + public AmazonS3InstallationService( |
| 47 | + String bucketName, |
| 48 | + AwsCredentialsProvider credentialsProvider, |
| 49 | + Region region, |
| 50 | + String endpointOverride |
| 51 | + ) { |
37 | 52 | this.bucketName = bucketName;
|
38 | 53 | this.credentialsProvider = credentialsProvider;
|
| 54 | + this.region = region != null ? region : Region.of(System.getenv("AWS_REGION")); |
| 55 | + this.endpointOverride = (endpointOverride != null && !endpointOverride.isEmpty()) ? URI.create(endpointOverride) : null; |
39 | 56 | }
|
40 | 57 |
|
41 | 58 | @Override
|
42 | 59 | public Initializer initializer() {
|
43 | 60 | return (app) -> {
|
44 | 61 | // The first access to S3 tends to be slow on AWS Lambda.
|
45 |
| - AwsCredentials credentials = createCredentials(getAwsCredentialsProvider()); |
| 62 | + AwsCredentials credentials = createCredentials(this.credentialsProvider); |
46 | 63 | if (credentials == null || credentials.accessKeyId() == null) {
|
47 | 64 | throw new IllegalStateException("AWS credentials not found");
|
48 | 65 | }
|
@@ -303,19 +320,16 @@ private Installer toInstaller(ResponseBytes<GetObjectResponse> s3Object) throws
|
303 | 320 | return JsonOps.fromJson(json, DefaultInstaller.class);
|
304 | 321 | }
|
305 | 322 |
|
306 |
| - protected AwsCredentialsProvider getAwsCredentialsProvider() { |
307 |
| - if (this.credentialsProvider == null) { |
308 |
| - this.credentialsProvider = DefaultCredentialsProvider.create(); |
309 |
| - } |
310 |
| - return this.credentialsProvider; |
311 |
| - } |
312 |
| - |
313 | 323 | protected AwsCredentials createCredentials(AwsCredentialsProvider provider) {
|
314 | 324 | return provider.resolveCredentials();
|
315 | 325 | }
|
316 | 326 |
|
317 | 327 | protected S3Client createS3Client() {
|
318 |
| - return S3Client.builder().credentialsProvider(this.credentialsProvider).build(); |
| 328 | + return S3Client.builder() |
| 329 | + .credentialsProvider(this.credentialsProvider) |
| 330 | + .region(this.region) |
| 331 | + .endpointOverride(this.endpointOverride) |
| 332 | + .build(); |
319 | 333 | }
|
320 | 334 |
|
321 | 335 | private String getInstallerKey(Installer i) {
|
|
0 commit comments