Как создать ссылку для загрузки s3, срок действия которой истекает только через 6 дней

Я хочу создать ссылку s3 для загрузки файла, ссылка должна быть активной не менее 6 дней. Я пробовал с параметрами InstanceProfileCredentialsProvider (false) (которые работали только в течение 24 часов), ProfileCredentialsProvider (даже не создает ссылку), ключ доступа

Ключ доступа пользователя IAM работал, но срок действия этого ключа истекает через несколько дней, поэтому каждый раз мне приходится менять его в коде, а также я думаю, что не рекомендуется раскрывать ключ в коде.

Есть ли другой способ создать ссылку для загрузки s3, срок действия которой истекает только через 6 дней.

Ниже приведен фрагмент кода: -

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);

person user3132347    schedule 17.12.2019    source источник
comment
Я настоятельно рекомендую использовать jets3t вместо голого AWS SDK; с этим гораздо меньше боли. (И используйте современные API времени Java 8; now().plus(6, DAYS).toEpochMilli() было бы намного легче читать.)   -  person chrylis -cautiouslyoptimistic-    schedule 17.12.2019
comment
Я думаю, для Jets3t также требуется ключ доступа и секретный ключ, которые мне нужно указать в коде. Там я столкнулся с проблемой. Я не хочу раскрывать ключ в коде.   -  person user3132347    schedule 17.12.2019
comment
Вам нужно узнать о внешней конфигурации. 12factor.net и Spring Boot (и некоторые подобные инструменты) упрощают это для приложений Java.   -  person chrylis -cautiouslyoptimistic-    schedule 18.12.2019
comment
Извините, а в чем конкретно проблема? Вы должны сгенерировать предварительно подписанный URL-адрес, используя учетные данные с неограниченным сроком действия. Таким образом, предварительно подписанный URL-адрес будет действовать в течение всего периода. Приложение должно использовать свой собственный (постоянный) ключ доступа для создания предварительно подписанных URL-адресов.   -  person John Rotenstein    schedule 18.12.2019


Ответы (1)


Общая идея того, как вы реализуете свое решение, — это правильный способ, предложенный AWS.

Что касается ключа пользователя, срок действия которого истекает через 80 дней, поскольку срок действия пользовательских ключей не истекает автоматически, и они действительны до тех пор, пока вы их не деактивируете, я полагаю, что это процесс, который вы настроили для ротации своих учетных данных по соображениям безопасности. Это действительно очень хорошая практика. Чтобы избежать жесткого кодирования этих учетных данных в коде, что является плохой практикой, вы можете просто настроить свои учетные данные как переменную среды или сохранить их в файле учетных данных AWS. strong> в вашем случае. Сделав это, вы сможете легко чередовать их в конвейере развертывания.

Вы можете настроить конфигурацию ./aws/credentials с помощью пользовательских данных при запуске экземпляра ec2. Вы запустите «aws configure», а затем передадите свои учетные данные aws, чтобы настроить их в своем экземпляре ec2. В идеале у вас должен быть конвейер CI/CD, который будет автоматизировать весь процесс, а не делать это вручную.

См. ниже рекомендуемые рекомендации AWS:

Предустановленный URL для сегментов s3 – рекомендуемые способы

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

Рекомендации по работе с ключами доступа AWS

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

Настройки файла конфигурации и учетных данных

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

person Xanthos Symeou    schedule 17.12.2019
comment
Я попытался сохранить учетные данные в файле .aws/credentials и использовал AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(new ProfileCredentialsProvider(profile2)).build(); Это тоже не работает. интересно, почему - person user3132347; 17.12.2019
comment
Что если экземпляры будут завершены и появятся новые экземпляры, нам нужно снова правильно установить учетные данные для новых экземпляров. или он примет это автоматически? - person user3132347; 17.12.2019
comment
- чтобы убедиться, что вы правильно настроили .aws/credentials, загрузите и настройте интерфейс командной строки AWS, а затем запустите: aws configure для настройки файла ~./aws/credentials. - person Xanthos Symeou; 17.12.2019
comment
Что касается завершенных экземпляров, вы должны снова установить учетные данные, вы правы. См. обновленный ответ выше. - person Xanthos Symeou; 17.12.2019