1

Ruby 용 Amazon Simple Workflow/AWS Flow 아키텍처에 관한 간단한 질문이 있습니다. 배경 지식으로는 Opsworks의 Ruby 레이어 용 AWS Flow에서 실행되는 하나의 액티비티로 간단한 워크 플로우가 있습니다. 나는 워크 플로우를 시작하고자하는 Rails App Server 레이어에서 실행중인 별도의 REST API를 Opsworks에서 가지고 있습니다.워크 플로 시작 클래스의 워크 플로 클래스 필요

워크 플로우를 맞이할 REST API의 코드 :

1: domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
2: workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{from_class: MyWorkflowClass}} 
3: workflow_client.start_execution(input_1: @input1, input_2: @input2) 

내 가정 내 워크 플로우 및 REST API의 코드베이스가 분리 될 수 있다는 유일한 공통 요소는 aws-flow 루비 보석이 될 것입니다 require 'aws/decider'. 그러나 내 REST API에도 require 'PATH_TO_MY_WORKFLOW_CLASS'이 있어야한다는 사실을 알고 있습니다. 내 REST API의 코드 파일에서 코드 줄을 제거하면 해당 워크 플로를 개막, 나는 다음과 같은 오류가 발생합니다 :

undefined method `_options' for nil:NilClass; ["/Users/MyName/.rvm/gems/ruby-2.0.0-p247/gems/aws-flow-2.2.1/lib/aws/decider/utilities.rb:183:in `interpret_block_for_options'", "/Users/MyName/.rvm/gems/ruby-2.0.0-p247/gems/aws-flow-2.2.1/lib/aws/decider/implementation.rb:73:in `workflow_client'" 
(error at line 2 above) 

나는 잘못이 있습니까? 내 워크 플로 시작 앱 (예 : 내 REST API)에 MyWorkflowClass를 실제로 요구해야합니까, 아니면 잘못하고 있습니까? 나는 문서를 샅샅이 뒤졌고 이에 대한 명확한 답을 찾을 수 없었다. 내가 찾을 수있는 모든 샘플은 실제로 워크 플로 시작 코드에 포함 된 워크 플로 클래스를 갖지만 단순한 샘플로 번들되거나 그것이 있어야하는 방식이기 때문에 이것이 맞는지 확실하지 않습니다. 샘플을 액면 그대로 사용하지 않는 이유는 워크 플로 시작 코드에서 워크 플로 클래스를 요구하는 것이 나에게 어울리지 않기 때문입니다. 그것은 나의 취향을 위해 너무 단단히 두 가지 응용 프로그램을 바인딩합니다.

답변

0

aws-flow-ruby sdk에 문제점을 게시하고 아마존 엔지니어로부터 답변을 얻었습니다. 즉, :from_class 옵션이나 :prefix_name:execution_method 옵션을 함께 사용할 수 있습니다.


은 AWS가 직접 SDK를 사용하여) 코드

1의 워크 플로우를 시작하는 두 가지 방법이 있습니다. 이 경우 코드에서 워크 플로 클래스에 대해 알 필요가 없습니다. 도메인, 워크 플로우 유형 (이름 및 버전) 및 워크 플로우 ID 만 있으면됩니다. 위에서 볼 수 있듯이이 모든 워크 플로우 클래스를 필요로하지 않습니다,

require 'aws-sdk-v1' 
swf = AWS::SimpleWorkflow.new.client 
swf.start_workflow_execution(
    domain: "HelloWorld", 
    workflow_type: { 
    name: "HelloWorldWorkflow", 
    version: "1.0" 
    }, 
    workflow_id: "foo", 
    input: ...., 
    ....other options (optional)... 
) 

- 이 같이 보일 것입니다.

2) aws-flow gem을 사용하십시오 (위에서 수행 한 작업). aws-flow gem에서 제공하는 워크 플로우 클라이언트를 사용하여 실행을 시작하는 두 가지 방법이 있습니다. 클라이언트를 일반 클라이언트로 사용하고 워크 플로 클래스에 연결하지 않거나 : from_class 옵션을 사용하여 특정 워크 플로 클래스의 옵션을 가져올 수 있습니다. from_class 옵션을 사용하려면 ObjectSpace에 클래스가 있어야합니다 (따라서 워크 플로우 파일이 필요합니다). from_class와

-

require 'aws/decider' 
domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{from_class: "MyWorkflowClass"}} 
workflow_client.start_execution(input_1: @input1, input_2: @input2) 

from_class없이 -

require 'aws/decider' 
domain = AWS::SimpleWorkflow.new.domains['my_domain'] 
workflow_client = AWS::Flow::workflow_client(domain.client, domain) {{ 
    prefix_name: "YourClassName", 
    execution_method: "workflow_method_name", 
    version: "1.0", 
    ...other options... 
}} 
workflow_client.start_execution(input_1: @input1, input_2: @input2) 

워크 플로 실행을 시작하기 위해 권장되는 방법은 직접 SDK를 사용하는 대신 AWS 흐름 WorkflowClient을 사용하는 것입니다.워크 플로에서 허용하는 입력에 대한


추가 참고 :


이 SDK 만 입력으로 문자열을 취할 것입니다 콘솔. 자유 형식 문자열이 될 수 있지만 루비 흐름을 사용하여 워크 플로를 작성한 경우이 문자열은 입력을 직렬화 한 형식이어야하므로 작업을 가져 와서 루비 개체로 변환 할 때 WorkflowWorker가 입력을 deserialize 할 수 있습니다. 해시 경우).

루비 플로우 WorkflowClient를 사용하면 클라이언트는 자동으로 입력 해시 (또는 다른 입력)를 문자열로 직렬화하여 SWF로 보냅니다. aws-flow는 기본적으로 YAML 기반 데이터 변환기를 사용하여이 작업을 수행합니다 (재정의 할 수 있음).

당신이 당신의 입력 해시 문자열로 어떻게 보이는지보고 싶다면, 당신이 할 수있는 다음 -

AWS::Flow::FlowConstants.default_data_converter.dump(input_hash) 

그런 다음 SDK 또는를 사용하여 워크 플로를 시작하려면이 직렬화 된 입력을 사용할 수 있습니다 콘솔.