Chcę wygenerować link s3 do pobrania pliku, link powinien być aktywny przez co najmniej 6 dni. Próbowałem z opcjami InstanceProfileCredentialsProvider (false) (które działały tylko przez 24 godziny), ProfileCredentialsProvider (nawet nie tworzy linku), Klucz dostępu

Klucz dostępu użytkownika IAM działał, ale ten klucz użytkownika wygasa po kilku dniach, więc za każdym razem muszę zmieniać to samo w kodzie, a także myślę, że ujawnianie klucza w kodzie nie jest dobrą praktyką.

Czy jest jakiś inny sposób na wygenerowanie linku do pobrania s3, który wygaśnie dopiero po 6 dniach.

Poniżej znajduje się fragment kodu: -

AmazonS3 s3Client  = AmazonS3ClientBuilder.standard().withCredentials(new InstanceProfileCredentialsProvider(false))
                    .build();
java.util.Date expiration = new java.util.Date();
long milliSeconds = expiration.getTime();
milliSeconds += 1000 * 60 * 60 * 24 * 7; // Add 7 days.
expiration.setTime(milliSeconds);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest("s3bucket",
                    "fileLocationpath");
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest.setExpiration(expiration);
link =  s3Client.generatePresignedUrl(generatePresignedUrlRequest);
3
user3132347 17 grudzień 2019, 08:58
Zdecydowanie polecam używanie jets3t zamiast samego AWS SDK; jest to o wiele mniej bolesne. (I używaj nowoczesnych interfejsów API Java 8; now().plus(6, DAYS).toEpochMilli() byłby znacznie łatwiejszy do odczytania.)
 – 
chrylis -cautiouslyoptimistic-
17 grudzień 2019, 10:39
Domyślam się, że do Jets3t potrzebny jest również klucz dostępu i klucz tajny, który muszę podać w kodzie. Tam mam do czynienia z problemem. Nie chcę ujawniać klucza w kodzie.
 – 
user3132347
17 grudzień 2019, 14:23
Musisz dowiedzieć się więcej o konfiguracji zewnętrznej. 12factor.net i Spring Boot (i niektóre podobne narzędzia) ułatwiają to aplikacjom Java.
 – 
chrylis -cautiouslyoptimistic-
18 grudzień 2019, 02:01
Przepraszamy, ale jaki jest konkretny problem? Wstępnie podpisany adres URL należy wygenerować przy użyciu poświadczeń, które nie wygasają. W ten sposób wstępnie podpisany adres URL będzie ważny przez cały okres. Aplikacja powinna używać własnego (stałego) klucza dostępu do generowania wstępnie podpisanych adresów URL.
 – 
John Rotenstein
18 grudzień 2019, 06:58

1 odpowiedź

Ogólna idea sposobu, w jaki wdrażasz swoje rozwiązanie, to właściwy sposób, jaki sugeruje AWS.

O kluczu użytkownika, który wygasa po 80 dniach, ponieważ klucze użytkownika nie wygasają automatycznie i są ważne, dopóki ich nie dezaktywujesz, wyobrażam sobie, że jest to proces, który ustawiłeś w celu rotacji poświadczeń ze względów bezpieczeństwa. To rzeczywiście bardzo dobra praktyka. Aby uniknąć twardego zakodowania tych poświadczeń w kodzie, co jest złą praktyką, możesz po prostu ustawić swoje poświadczenia jako zmienną środowiskową lub przechowywać je w pliku poświadczeń AWS w twoim przypadku. W ten sposób możesz łatwo obracać je za pośrednictwem potoku wdrażania.

Konfigurację ./aws/credentials można przeprowadzić za pomocą danych użytkownika podczas uruchamiania instancji ec2. Uruchomisz „aws configure”, a następnie przekażesz swoje dane uwierzytelniające aws, aby ustawić je w swojej instancji ec2. Idealnie byłoby mieć potok CI/CD, który zautomatyzuje cały proces zamiast robić to ręcznie.

Zapoznaj się z poniższymi najlepszymi praktykami zalecanymi przez AWS:

Przypisany URL dla zasobników s3 – zalecane sposoby

https://aws.amazon.com/premiumsupport/knowledge-center/presigned-url-s3-bucket-expiration/

Najlepsze praktyki dotyczące kluczy dostępu AWS

https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html

Ustawienia konfiguracji i plików poświadczeń

https://docs.aws.Amazon.com/cli/latest/userguide/cli-configure-files.html.

3
Xanthos Symeou 17 grudzień 2019, 16:02
Próbowałem zapisać poświadczenia w pliku .aws/credentials i użyłem AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider("profile2")).build(); To też nie działa. zastanawiam się dlaczego
 – 
user3132347
17 grudzień 2019, 14:20
A jeśli instancje zostaną zakończone i pojawią się nowe instancje, musimy ponownie ustawić poświadczenia dla nowych instancji. czy zajmie to automatycznie?
 – 
user3132347
17 grudzień 2019, 15:09
- aby mieć pewność, że poprawnie skonfigurowałeś pliki .aws/credentials, pobierz i skonfiguruj swój interfejs AWS CLI, a następnie uruchom : "aws configure" w celu skonfigurowania pliku ~./aws/credentials.
 – 
Xanthos Symeou
17 grudzień 2019, 15:55
Jeśli chodzi o zakończone instancje, musisz ponownie ustawić poświadczenia, jeśli masz rację. Zobacz zaktualizowaną odpowiedź powyżej.
 – 
Xanthos Symeou
17 grudzień 2019, 15:55