Получение услуг: AmazonKinesis; Код состояния: 502 с apache-flink и localstack Kinesis

Моя локальная установка состоит из local apache-flink (устанавливается через brew) и localstack с запущенной службой Kinesis.

мой докер-сочинитель имеет

  localstack:
    image: localstack/localstack:0.10.7
    environment:
      - SERVICES=kinesis
    ports:
      - "4568:4568"

и мой потребитель Kinesis:

kinesisConsumerConfig.setProperty(ConsumerConfigConstants.AWS_ACCESS_KEY_ID, "123");
kinesisConsumerConfig.setProperty(ConsumerConfigConstants.AWS_SECRET_ACCESS_KEY, "123");
kinesisConsumerConfig.setProperty(ConsumerConfigConstants.AWS_ENDPOINT, "http://localhost:4568");

но когда я запускаю программу Flink, я получаю такую ​​ошибку:

Вызвано: org.apache.flink.kinesis.shaded.com.amazonaws.services.kinesis.model.AmazonKinesisException: null (служба: AmazonKinesis; код состояния: 502; код ошибки: null; идентификатор запроса: null)

Это происходит только при использовании localstack. Если я подключаюсь к своему потоку Kinesis в своей учетной записи AWS, он работает отлично.


person Marco    schedule 10.02.2020    source источник


Ответы (3)


Добавьте эти строки, прежде чем добавлять FlinkKinesisConsumer в качестве источника:

System.setProperty("com.amazonaws.sdk.disableCbor", "true") System.setProperty("org.apache.flink.kinesis.shaded.com.amazonaws.sdk.disableCbor", "true")

Это имеет тот же эффект, что и экспорт переменных ENV, но на то, чтобы поместить это в код, меньше времени тратится на настройку среды.

person fsilvestre    schedule 05.03.2020

Если вы используете Java, вы можете использовать библиотеку jar для имитации некоторых компонентов Amazon:

В первую очередь вам нужно добавить следующий компонент в ваш pom.xml, чтобы иметь возможность инициализировать локальный стек непосредственно во время теста:

<dependency>
    <groupId>cloud.localstack</groupId>
    <artifactId>localstack-utils</artifactId>
    <version>0.2.0</version>
    <scope>test</scope>
</dependency>

Затем вам нужно указать следующую библиотеку, если вам нужно использовать kinesis и dynamo, потому что последняя версия, предоставленная из aws, не совместима с последней версией localstack:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.11.642</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>amazon-kinesis-client</artifactId>
    <version>1.8.10</version>
    <scope>test</scope>
</dependency>

Теперь вы можете использовать следующие аннотации, чтобы создать экземпляр стека с помощью докера, изображения будут извлечены автоматически, если они отсутствуют в системе. Таким образом, нет необходимости запускать какой-либо образ docker / docker-compose.

@LocalstackDockerProperties(services = {"kinesis", "dynamodb"})
@ExtendWith(LocalstackDockerExtension.class)
@Slf4j
public class TestPipelineComplete {

public static final String AWS_ACCESS_KEY_ID = "foo";
public static final String AWS_SECRET_ACCESS_KEY = "bar";
    static {
        System.setProperty("AWS_ACCESS_KEY_ID", AWS_ACCESS_KEY_ID);
        System.setProperty("AWS_SECRET_ACCESS_KEY", AWS_SECRET_ACCESS_KEY);
        // These two lines are fundamental
        cloud.localstack.TestUtils.setEnv("aws.cborEnabled", "false");
        cloud.localstack.TestUtils.setEnv("AWS_CBOR_DISABLE", "true");
    }
}

Теперь, если вам нужно инициализировать DynamoDB клиента, вы можете использовать следующую строку:

final AmazonDynamoDB clientDynamoDB = cloud.localstack.TestUtils.getClientDynamoDB();

Теперь, если вам нужно инициализировать Kinesis клиента, вы можете использовать следующую строку:

final AmazonKinesis kinesisClient = cloud.localstack.TestUtils.getClientKinesis();

Если вам нужно прочитать данные из kinesis (тестовая цель), вы можете использовать следующий фрагмент кода в качестве шаблона (https://gist.github.com/alessiosavi/4ea88d73d6853de695843631207b7bc6):

package org.example;

import com.amazonaws.services.kinesis.AmazonKinesis;
import com.amazonaws.services.kinesis.AmazonKinesisClientBuilder;
import com.amazonaws.services.kinesis.model.*;

import java.nio.charset.StandardCharsets;
import java.util.List;

public class App {

    private static final String streamName = "API_NAME" + "_kineis-notification-stream";
    private static final AmazonKinesis client = AmazonKinesisClientBuilder.defaultClient();

    public static void main(String[] args) {
        printKinesisRecords(getRecordsFromKinesis(client));
    }


    private static List<Record> getRecordsFromKinesis(AmazonKinesis kClient) {
        final ListShardsRequest listShardsRequest = new ListShardsRequest().withStreamName(streamName).withMaxResults(1);

        Shard shard = kClient.listShards(listShardsRequest).getShards().get(0);
        GetShardIteratorRequest getShardIteratorRequest = new GetShardIteratorRequest();
        getShardIteratorRequest.setStreamName(streamName);
        getShardIteratorRequest.setShardId(shard.getShardId());
        getShardIteratorRequest.setShardIteratorType("TRIM_HORIZON");

        final GetShardIteratorResult getShardIteratorResult = kClient.getShardIterator(getShardIteratorRequest);
        String shardIterator = getShardIteratorResult.getShardIterator();

        // Create a new getRecordsRequest with an existing shardIterator
        // Set the maximum records to return to 1
        GetRecordsRequest getRecordsRequest = new GetRecordsRequest();
        getRecordsRequest.setShardIterator(shardIterator);
        getRecordsRequest.setLimit(10);

        final GetRecordsResult result = kClient.getRecords(getRecordsRequest);
        // Put the result into record list. The result can be empty.
        return result.getRecords();
    }

    private static void printKinesisRecords(List<Record> records) {
        for (Record record : records) {
            System.err.println("RECORD: " + StandardCharsets.UTF_8.decode(record.getData()).toString());
        }
    }
}
person alessiosavi    schedule 12.02.2020

Оказывается, нам нужно отключить проверку cbor и сертификата через ENV var и начать мигать в той же консоли.

export AWS_CBOR_DISABLE=1
DISABLE_CERT_CHECKING_JAVA_OPTS="-Dorg.apache.flink.kinesis.shaded.com.amazonaws.sdk.disableCertChecking"
export FLINK_ENV_JAVA_OPTS=${DISABLE_CERT_CHECKING_JAVA_OPTS}
/usr/local/Cellar/apache-flink/1.9.1/libexec/bin/start-cluster.sh
person Marco    schedule 13.02.2020