Конечная точка локального стека 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» .

Другие вопросы по тегам