不涉及 lambda 的 AWS Ec2 实例中的工作流设计

Workflow design in AWS Ec2 instances not involving lambda

提前感谢您的时间和回答。

But is there a better and preferred way to achieve this ?

是的。现在首选的方法是使用 AWS Step Functions which is (sort of) an improved, simplified and clean version of Amazon Simple Workflow. Since you have a precompiled executables running in a sequential order it might be worth it to also take a look at AWS Batch.

Step Functions 基本上是 Lambda 函数,但您可以将可执行文件与部署包一起发送并从 Lambda 函数执行它们。

根据 Sergey 提供的答案,我实现了 Step Function,效果很好。 我将此作为跟进发布,以提供有关我如何实现此功能的更多详细信息。

1) 使用 JSON DSL 从 AWS 控制台创建了一个包含一系列活动的 AWS 状态机。 (有几篇文章解释了如何创建状态机)

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 步骤函数中的第一个 activity。

        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 功能和活动。