Проектирование рабочих процессов в экземплярах AWS Ec2 без лямбды

Заранее спасибо за ваше время и ответы.

  • У меня есть несколько, скажем, 3 окна AWS EC2.
  • У меня есть исполняемые файлы.NET A, B и C в каждом из 3 экземпляров Windows. (Я мог бы также иметь Java-программы в смеси)
  • Их нужно запускать один за другим в рабочем режиме, как в зависимости от результата предыдущего исполняемого файла. т.е. B должен работать после того, как A преуспел; C должен работать после того, как B преуспел и т. Д. Короче говоря, я стремлюсь достичь рабочего процесса.

  • Находясь в AWS, я посмотрел на Amazon Simple Workflow; Однако, чтобы использовать это, мне нужно в AWS SWS SDK добавить в код.NET. Но, к сожалению, у меня есть только исполняемый файл, и мне не разрешено его перестраивать.

  • Я также имею в виду Amazon Simple Queue Service и службу уведомлений.

    Но есть ли лучший и предпочтительный способ добиться этого?

2 ответа

Решение

Но есть ли лучший и предпочтительный способ добиться этого?

Да. В настоящее время предпочтительным способом является использование AWS Step Functions, которая является (вроде) улучшенной, упрощенной и чистой версией Amazon Simple Workflow. Поскольку у вас есть предварительно скомпилированные исполняемые файлы, работающие в последовательном порядке, возможно, стоит также взглянуть на пакет AWS.

Шаговые функции - это в основном лямбда-функции, но вы можете отправлять исполняемые файлы вместе с пакетом развертывания и выполнять их из лямбда-функций.

Основываясь на ответе Сергея, я реализовал функцию Step, и она прекрасно работает. Я публикую это как продолжение, чтобы предоставить более подробную информацию о том, как я это реализовал.

1) Создал конечный автомат AWS с последовательностью операций из консоли AWS с использованием JSON DSL. (Есть несколько постов, которые объясняют, как создавать конечные автоматы)

2) Мой конечный автомат должен запустить рабочий процесс на основе загрузки файла в определенный каталог.

3) Итак, я написал Java-приложение (может быть C# или что-нибудь), которое будет

  • используйте средство просмотра файлов, чтобы запустить рабочий процесс AWS.

    import com.amazonaws.services.stepfunctions.AWSStepFunctions;
    import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder;
    import com.amazonaws.services.stepfunctions.model.StartExecutionRequest;
    
    class StepFunctionExecution {
    private StartExecutionRequest startExecutionRequest = new StartExecutionRequest();
    public void Start(String filePath){
        final AWSStepFunctions client = AWSStepFunctionsClientBuilder
                .standard()
                .build();
    
        /** Start execution */
        startExecutionRequest.setStateMachineArn("MyARN");
        startExecutionRequest.setName(java.util.UUID.randomUUID().toString());
        String inputJson = "{\r\n  \"FilePath\": \"" + filePath + "\"\r\n}";
        startExecutionRequest.setInput(inputJson);
        client.startExecution(startExecutionRequest);
        }
    }
    

4) Я запустил другой поток в том же Java-приложении (я мог бы также использовать отдельное Java-приложение)

  • который непрерывно контролирует первое действие в функции шага AWS.

        final ClientConfiguration clientConfiguration = new ClientConfiguration();
    clientConfiguration.setSocketTimeout((int) TimeUnit.SECONDS.toMillis(65));
    final AWSStepFunctions client = AWSStepFunctionsClientBuilder
            .standard()
            .withClientConfiguration(clientConfiguration)
            .build();
    
    while (true) {
        GetActivityTaskResult getActivityTaskResult =
                client.getActivityTask(
                        new GetActivityTaskRequest().withActivityArn("myArn"));
        if (getActivityTaskResult.getTaskToken() != null) {
            try {
                    // Do actual processing
                    client.sendTaskSuccess(
                            new SendTaskSuccessRequest()
                                    .withOutput("{}")
                                    .withTaskToken(getActivityTaskResult.getTaskToken()));
            } catch (final Exception e) {
                client.sendTaskFailure(
                        new SendTaskFailureRequest()
                                .withCause(e.getMessage())
                                .withTaskToken(getActivityTaskResult.getTaskToken()));
            }
        } else {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

5) Я запустил эти исполняемые файлы Java прямо внутри экземпляра AWS EC2.

Экземплярам EC2 была назначена роль IAM для доступа к ресурсам функции Step и т. Д.

Таким образом, не было необходимости в отдельных учетных данных для доступа к функциям и действиям Step.

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