Проектирование рабочих процессов в экземплярах AWS Ec2 без лямбды - PullRequest
0 голосов
/ 06 января 2019

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

  • У меня есть несколько, скажем, 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 и служба уведомлений в разум.

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

Ответы [ 2 ]

0 голосов
/ 23 января 2019

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

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 не требовалось отдельных учетных данных.

0 голосов
/ 06 января 2019

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

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

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

...