AWS Java SDK — недопустимый токен безопасности

#amazon-web-services #amazon-ec2 #aws-credentials

Вопрос:

Я пытаюсь использовать Java SDK AWS SNS в приложении, размещенном на компьютере EC2. Для SDK SNS способ предоставления учетных данных отличается от других пакетов SDK, таких как S3. Я не указывал механизм цепочки учетных данных, и на моем локальном компьютере, похоже, он по умолчанию извлекает учетные данные из файла .aws/учетные данные.

Я обновил свои учетные данные с моего компьютера EC2, которые находятся по адресу ~/.aws/учетные данные. Однако при запуске моего приложения на EC2 я получаю следующую ошибку при попытке опубликовать сообщение в SNS:

исключение software.amazon.awssdk.services.sns.model.SnsException: Маркер безопасности, включенный в запрос, недействителен. (Служба: Sns, Код Статуса: 403, Идентификатор Запроса: 3177217e-e32d-5df5-ab2a-783f74fb6209, Идентификатор Расширенного Запроса: null)

Вещи, которые я пробовал до сих пор:

  • Я предоставил 777 разрешений для папки .aws.
  • Проверил переменную $HOME, она выводит: /home/ec2-пользователь. Мне это кажется нормальным.
  • Попытался жестко закодировать учетные данные AWS из кода, но SDK, похоже, не позволяет указать токен сеанса.
  • Я должен упомянуть, что у меня были те же проблемы с S3, но этот SDK позволил мне полностью указать учетные данные из кода.

Я импортировал SDK SNS следующим образом:

pom.xml

 ...
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>2.16.29</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

...

<dependency>
            <groupId>software.amazon.awssdk</groupId>
            <artifactId>sns</artifactId>
</dependency>
 

Минимальный код SNS Java:

 SnsClient client = SnsClient.builder()
            .region(Region.US_EAST_1)
            .build();
    try {
        PublishRequest request = PublishRequest.builder()
                .message("message")
                .topicArn("topicName")
                .build();
        PublishResponse result = client.publish(request);
        System.out.println("Published: "   message   " "   result.messageId()   " Message sent. Status was "   result.sdkHttpResponse().statusCode());
    } catch (SnsException e){
        e.printStackTrace();
    }
 

У тебя есть какие-нибудь идеи о том, что может происходить?
Спасибо!

Ответ №1:

Одна вещь, которую вы можете попробовать проверить, работает ли она при использовании службы SNS на экземпляре EC2, — это установить переменные среды. Когда я развертываю веб-приложение на экземпляре EC2 (с использованием эластичного бобового стебля), который использует API SNS Java V2, я сделал это, и это работает нормально.

 private SnsClient getSnsClient() {

    Region region = Region.US_WEST_2;
    SnsClient snsClient = SnsClient.builder()
            .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
            .region(region)
            .build();

    return snsClient;
 }
 

Комментарии:

1. Вы протестировали cred в основном примере Java на своей машине разработчика, чтобы убедиться, что они действительны?

2. Да, это работает. В EC2 я установил переменные среды из файла ~/.bash_profile. По крайней мере, можно было бы сказать, что срок действия токена безопасности истек..

3. ТАКИМ образом, ваши учетные данные работают в локальной среде разработки, но не работают в EC2 — даже при использовании переменных env?

4. ДА. Система локальной разработки использует Windows, если это имеет какое-либо значение. Приложение развернуто в виде веб-архива под управлением Payara. Веб-архив построен на локальной машине разработчика, но, опять же, я не вижу, как это может повлиять каким-либо образом..

5. Сегодня я попробую то же самое на новой машине EC2. Кроме того, есть ли способ зарегистрировать учетные данные, которые пытаются использовать SDK?