【问题标题】:Workflow design in AWS Ec2 instances not involving lambda不涉及 lambda 的 AWS Ec2 实例中的工作流程设计
【发布时间】:2019-06-01 01:58:07
【问题描述】:

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

  • 我有多个,比如 3 个 AWS EC2 Windows 实例。
  • 我在 3 个 Windows 实例中的每一个中都有 .NET 可执行文件 A、B 和 C。 (我也可以混合使用 java 程序)
  • 它们需要一个接一个地以类似工作流的方式运行,具体取决于前一个可执行文件的结果。即 B 应该在 A 成功后运行; C 应该在 B 成功后运行等等。简而言之,我期待 实现工作流程。

  • 在 AWS 中,我查看了 Amazon Simple Workflow;但是对我来说 要使用它,我需要在 .NET 代码中编写 AWS SWS SDK。但 不幸的是,我只有可执行文件,不允许 重建它。

  • 我还有 Amazon Simple Queue Service 和通知服务 头脑。

    但是有没有更好和首选的方法来实现这一点?

【问题讨论】:

    标签: amazon-ec2 workflow amazon-swf aws-step-functions


    【解决方案1】:

    但是有没有更好和首选的方法来实现这一点?

    是的。现在首选的方法是使用AWS Step Functions,这是(某种)改进、简化和干净的 Amazon Simple Workflow 版本。由于您有一个按顺序运行的预编译可执行文件,因此不妨看看AWS Batch

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

    【讨论】:

    • 非常感谢谢尔盖先生。我不了解 AWS Step 功能,并且在对其进行调查时,似乎是最好的解决方案。我可以添加可以与我在 EC2 实例上运行的可执行文件相关联的活动。为了其他人的利益,我将实施解决方案并在此处提供详细信息。
    【解决方案2】:

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

    1) 从 AWS 控制台使用 JSON DSL 创建了一个包含一系列活动的 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 step 函数中的第一个活动。

          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) 我在 AWS EC2 实例中运行了这些 Java 可执行文件。

    EC2 实例被分配了 IAM 角色以访问 Step 函数资源等。

    因此,无需单独的凭据即可访问 Step 功能和活动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 2017-11-25
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2019-06-26
      • 2017-06-23
      相关资源
      最近更新 更多