Проектирование рабочих процессов в экземплярах 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.