Трудности управления несколькими именованными профилями с помощью AWS-SDK

Позвольте мне рассказать вам историю того, как я научился этому на собственном горьком опыте.

Прежде всего давайте разберемся, что такое профили AWS:

Профили AWS представляют собой комбинацию учетных данных пользователя с их конфигурациями. Они используются для управления несколькими пользователями на одном компьютере. Когда вы даете им имя, они называются именованными профилями.

Это помогает нам выбирать между различными профилями для различных операций, которые вы выполняете в своей учетной записи AWS.

$ aws ec2 describe-instances --profile [name-of-your-profile]

Пример профиля выглядит так, который обычно хранится в ~/.aws:

Учетные данные хранятся в текстовом файле учетных данных:

[omkar-test]
aws_access_key_id = some-access-key
aws_secret_access_key = some-secret-key

Конфигурации хранятся в текстовом файле конфигурации.

[profile omkar-test]
region = us-east-1
output = json

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

Все идет нормально.

Использование AWS SDK

При использовании AWS SDK по умолчанию он ищет профиль по умолчанию в ~/.aws, где имя профиля упоминается следующим образом [default].

Если вы хотите использовать настраиваемый профиль, вы можете указать его как переменную среды.

AWS_PROFILE="omkar-test"

например, для проекта, созданного с помощью gradle, это можно сделать с помощью следующей команды

AWS_PROFILE="omkar-test" ./gradlew bootRun

Когда вы сделаете это, AWS SDK v1 выдаст предупреждение вроде этого

WARNING: Your profile name includes a 'profile ' prefix. This is considered part of the profile name in the Java SDK, so you will need to include this prefix in your profile name when you reference this profile from your Java code.
#credentials do not require the profile keyword https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html

Это означает, что AWS SDK считает (кодируется так, чтобы думать), что ключевое слово профиля является частью самого имени профиля.

Поэтому вместо того, чтобы говорить AWS_PROFILE=”omkar-test” ./gradlew bootRun, вам нужно сказать AWS_PROFILE=”profile omkar-test” ./gradlew bootRun

После этого предупреждение исчезнет, ​​и вы останетесь довольны тем, что был выбран правильный профиль, что позже, проведя слишком много свободного времени, вы поймете, что это правда лишь отчасти.

Почему это проблема?

Это проблема, потому что AWS SDK обнаружит конфигурацию с именем [profile some-profile], но не с учетными данными. Чтобы вышеуказанное работало, учетные данные должны называться [profile some-profile], что неверно. Вы также можете найти его в разделе важные примечания на странице именованных профилей в документации AWS.

Путаница возникает из-за того, что AWS for CLI использует другой формат именования для именованных профилей в файле конфигурации и учетных данных , тогда как AWS SDK ожидает, что они будут такими же.

Учитывая это, в идеальном случае AWS SDK должен генерировать исключение, когда вы пытаетесь создать компонент / объект любого из ресурсов AWS, говоря, что учетные данные не найдены. Но этого не происходит в конкретном случае создания предварительно подписанного URL-адреса для объекта S3. Что происходит, так это то, что он сгенерирует URL-адрес без x-amz-security-token (в основном это просто URL-адрес, а не подписанный).

Это приводит к путанице в отношении того, почему URL-адрес был сгенерирован, но не с правильным токеном при использовании правильного профиля.

После некоторой отладки я вскоре осознал проблему и придумал хак (немного уродливый), чтобы заставить ее работать. Выглядит это примерно так:

[profile omkar-test]
region = us-east-1
output = json
#Duplicate profile names after omitting the word profile to make it compatible with java aws sdk
#WARNING: Your profile name includes a 'profile ' prefix. This is considered part of the profile name in the Java SDK, so you will need to include this prefix in your profile name when you reference this profile from your Java code.
#credentials do not require the profile keyword https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html
[omkar-test]
region = us-east-1
output = json

Это гарантирует, что когда я говорю AWS_PROFILE=”omkar-test” ./gradlew bootRun, он работает из коробки без предупреждений.

Подробнее об этом здесь, где люди, которые в конечном итоге изучили это на собственном горьком опыте (например, я), задокументировали проблему :)

Надеюсь, вам понравилось это читать :)

👋 Присоединяйтесь к FAUN сегодня и получайте похожие истории каждую неделю на свой почтовый ящик! Получите еженедельную дозу обязательных к прочтению технических статей, новостей и руководств.

Подписывайтесь на нас в Twitter 🐦 и Facebook 👥 и Instagram 📷 и присоединяйтесь к нашим Facebook и Linkedin Группы 💬

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку хлопка 👏 ниже, чтобы выразить поддержку автору! ⬇