不涉及 lambda 的 AWS Ec2 实例中的工作流设计
Workflow design in AWS Ec2 instances not involving lambda
提前感谢您的时间和回答。
- 我有多个,比如 3 个 AWS EC2 windows 个实例。
- 我在 3 个 windows 实例中的每个实例中都有 .NET 可执行文件 A、B 和 C。 (我也可以混合使用 java 个程序)
它们需要 运行,一个接一个,在时尚的工作流程中,取决于前一个可执行文件的结果。即 B 应该在 A 成功后 运行; B 成功后 C 应该 运行 等。简而言之,我期待
实现工作流程。
在AWS,看了看Amazon Simple Workflow;然而对我来说
要使用它,我需要在 .NET 代码中加入 AWS SWS SDK。但
不幸的是我只有可执行文件并且不允许
重建它。
我还有Amazon Simple Queue Service和通知服务
头脑。
但是有没有更好的首选方法来实现这一点?
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 功能和活动。
提前感谢您的时间和回答。
- 我有多个,比如 3 个 AWS EC2 windows 个实例。
- 我在 3 个 windows 实例中的每个实例中都有 .NET 可执行文件 A、B 和 C。 (我也可以混合使用 java 个程序)
它们需要 运行,一个接一个,在时尚的工作流程中,取决于前一个可执行文件的结果。即 B 应该在 A 成功后 运行; B 成功后 C 应该 运行 等。简而言之,我期待 实现工作流程。
在AWS,看了看Amazon Simple Workflow;然而对我来说 要使用它,我需要在 .NET 代码中加入 AWS SWS SDK。但 不幸的是我只有可执行文件并且不允许 重建它。
我还有Amazon Simple Queue Service和通知服务 头脑。
但是有没有更好的首选方法来实现这一点?
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 功能和活动。