Конечная точка локального стека AWS в приложении
Я хотел бы запустить функциональные тесты для моего приложения, которое пытается опубликовать сообщение в AWS SNS. Я попытался localstack и обнаружил, что он делает все, что мне нужно, чтобы издеваться и публиковать сообщения локально. Но мое приложение использует Java-клиент Amazon для SDK, и когда я запускаю его локально, оно все равно пытается отправлять запросы в регион Amazon вместо локального стека.
Какая конфигурация требуется, чтобы приложение взаимодействовало с локальным стеком, а не с URL-адресом AWS? Можем ли мы указать URL-адрес конечной точки в конфигурации AWS? Я обнаружил, что это является открытой проблемой в AWS CLI https://github.com/aws/aws-cli/issues/1270
Есть ли обходной путь, который кто-нибудь реализовал для этого?
3 ответа
Чтобы использовать ваш локальный стек, вы должны установить свою EndpointConfiguration.
AmazonSNS amazonSNS = AmazonSNSClientBuilder.standard()
.withEndpointConfiguration(new EndpointConfiguration("http://localhost:4575", "eu-west-1"))
.build();
Вы также должны использовать https://github.com/localstack/localstack вместо https://github.com/atlassian/localstack (больше не поддерживается).
Если вы используете JUnit 5 для тестов, позвольте мне порекомендовать вам расширения JUnit 5 для AWS, несколько расширений JUnit 5, которые могут быть полезны для тестирования кода, связанного с AWS. Эти расширения можно использовать для внедрения клиентов для клиентов сервисов AWS, предоставляемых такими инструментами, как localstack (или настоящими). Поддерживаются как AWS Java SDK v 2.x, так и v 1.x:
public static class Endpoint implements AWSEndpoint {
@Override
public String url() { return "http://localhost:4575"; }
@Override
public String region() { return "us-east-1"; }
@Override
public String accessKey() { return ""; }
@Override
public String secretKey() { return ""; }
}
@ExtendWith(SNS.class)
class AmazonDynamoDBInjectionTest {
@AWSClient(endpoint = Endpoint.class)
private AmazonSNS client;
@Test
void test() throws Exception {
Assertions.assertNotNull(client);
…
}
}
Как упоминалось выше, вам необходимо добавить конфигурацию конечной точки в любую службу, которую вы используете (SQS, SNS и т. д.). «http://localhost:4575» в моем случае не сработало, потому что нам нужно включить конечные точки HTTPS с действительными сертификатами.
Новая конечная точка, рекомендуемая для сервисов AWS, — «localhost.localstack.cloud:4575» , поскольку домен является общедоступным, а также публикует сертификат SSL, который автоматически используется внутри LocalStack, чтобы включить конечные точки HTTPS с действительными сертификатами. Приведенный ниже код работал у меня:
String serviceEndpoint =
String.format("%s:%d", "http://localhost.localstack.cloud", localstack.getMappedPort(4575));
AmazonSNS amazonSNS =
AmazonSNSClientBuilder.standard()
.withEndpointConfiguration(
new EndpointConfiguration(serviceEndpoint,"us-east-1")).build();
Примечание . Если ваша система находится за корпоративным брандмауэром или интернет-провайдером, предпочтительнее использовать localhost , поскольку он не позволяет правильно разрешить «localhost.localstack.cloud» .