#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?