AWS SDK for Java 1.x는 2024년 7월 31일부터 유지 관리 모드로 전환되었으며 2025년 12월 31end-of-support
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Lambda 작업
Amazon SWF 활동의 대안으로 또는 이러한 활동과 함께, Lambda
이 항목에서는 AWS SDK for Java를 사용하여 Amazon SWF Lambda 작업을 구현하는 방법을 중점적으로 설명합니다. Lambda 작업에 대한 자세한 내용은 Amazon SWF 개발자 안내서의 AWS Lambda 작업을 참조하세요.
Lambda 함수를 실행하도록 교차 서비스 IAM 역할 설정
Amazon SWF에서 Lambda 함수를 실행하려면 먼저 사용자를 대신하여 Lambda 함수를 실행할 권한을 Amazon SWF에 부여하도록 IAM 역할을 설정해야 합니다. 이와 같이 설정하는 방법에 대한 자세한 내용은 AWS Lambda 작업 단원을 참조하세요.
Lambda 작업을 사용할 워크플로를 등록할 때 이 IAM 역할의 Amazon 리소스 이름(ARN)이 필요합니다.
Lambda 함수 생성
Java를 비롯하여 다양한 언어로 Lambda 함수를 작성할 수 있습니다. Lambda 함수 작성, 배포 및 사용 방법에 대한 자세한 내용은 AWS Lambda 개발자 안내서를 참조하세요.
참고
Lambda 함수를 작성하는 데 사용하는 언어와 무관합니다. 즉, 워크플로 코드의 작성 언어와 관계없이 모든 Amazon SWF 워크플로에서 예약하고 실행할 수 있습니다. Amazon SWF는 함수 실행 및 함수와 주고받는 데이터 전달에 대한 세부 사항을 처리합니다.
다음은 간단한 Amazon SWF 애플리케이션 구축 작업 대신 사용할 수 있는 간단한 Lambda 함수입니다.
-
이 버전은 JavaScript로 작성되었으며, AWS Management Console
을 사용하여 직접 입력할 수 있습니다. exports.handler = function(event, context) { context.succeed("Hello, " + event.who + "!"); };
-
다음은 Java로 작성된 동일 함수로, Lambda에서 배포 및 실행할 수도 있습니다.
package example.swf.hellolambda; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.util.json.JSONException; import com.amazonaws.util.json.JSONObject; public class SwfHelloLambdaFunction implements RequestHandler<Object, Object> { @Override public Object handleRequest(Object input, Context context) { String who = "{SWF}"; if (input != null) { JSONObject jso = null; try { jso = new JSONObject(input.toString()); who = jso.getString("who"); } catch (JSONException e) { e.printStackTrace(); } } return ("Hello, " + who + "!"); } }
참고
Lambda에 Java 함수를 배포하는 방법에 대해 자세히 알아보려면 AWS Lambda 개발자 안내서의 배포 패키지 생성(Java)을 참조하세요. 또한 Java로 Lambda 함수를 작성하기 위한 프로그래밍 모델 단원을 살펴볼 수도 있습니다.
Lambda 함수는 event 또는 input 객체를 첫 번째 매개 변수로 사용하고, context 객체를 두 번째 매개 변수로 사용하여 Lambda 함수 실행 요청에 대한 정보를 제공합니다. 이 특수한 함수에서는 입력이 JSON 형식이어야 하며, who
필드가 인사말을 생성하는 데 사용된 이름으로 설정되어야 합니다.
Lambda에 사용할 워크플로 등록
워크플로에서 Lambda 함수를 예약하려면 Lambda 함수 호출 권한을 가진 권한을 Amazon SWF에 제공하는 IAM 역할의 이름을 지정해야 합니다. RegisterWorkflowTypeRequest의 withDefaultLambdaRole
또는 setDefaultLambdaRole
메서드를 사용하여 워크플로를 등록하는 동안 이를 설정할 수 있습니다.
System.out.println("** Registering the workflow type '" + WORKFLOW + "-" + WORKFLOW_VERSION + "'."); try { swf.registerWorkflowType(new RegisterWorkflowTypeRequest() .withDomain(DOMAIN) .withName(WORKFLOW) .withDefaultLambdaRole(lambda_role_arn) .withVersion(WORKFLOW_VERSION) .withDefaultChildPolicy(ChildPolicy.TERMINATE) .withDefaultTaskList(new TaskList().withName(TASKLIST)) .withDefaultTaskStartToCloseTimeout("30")); } catch (TypeAlreadyExistsException e) {
Lambda 작업 예약
Lambda 작업 예약은 활동 예약과 비슷합니다. '스케줄 Lambda 함수' `ScheduleLambdaFunction`DecisionType 및 ScheduleLambdaFunctionDecisionAttributes와 함께 결정을 제공합니다.
running_functions == 0 && scheduled_functions == 0) { AWSLambda lam = AWSLambdaClientBuilder.defaultClient(); GetFunctionConfigurationResult function_config = lam.getFunctionConfiguration( new GetFunctionConfigurationRequest() .withFunctionName("HelloFunction")); String function_arn = function_config.getFunctionArn(); ScheduleLambdaFunctionDecisionAttributes attrs = new ScheduleLambdaFunctionDecisionAttributes() .withId("HelloFunction (Lambda task example)") .withName(function_arn) .withInput(workflow_input); decisions.add(
ScheduleLambdaFuntionDecisionAttributes
에, 이름(호출할 Lambda 함수의 ARN)과, id(Amazon SWF가 기록 로그에서 Lambda 함수를 식별하는 데 사용할 이름)를 지정해야 합니다.
또한 Lambda 함수에 선택적 입력을 제공하고 시작에서 종료까지 제한 시간 값을 설정할 수 있습니다. 이 값은 LambdaFunctionTimedOut
이벤트를 생성하기 전에 Lambda 함수를 실행할 수 있는 시간(초)입니다.
참고
이 코드는 함수 이름이 지정된 경우 AWSLambdaClient를 사용하여 Lambda 함수의 ARN을 가져옵니다. 이 기법을 사용하여 코드에서 전체 ARN(AWS 계정 ID 포함)가 하드코딩되는 것을 방지할 수 있습니다.
결정자에서 Lambda 함수 이벤트 처리
Lambda 작업은 워크플로 워커의 의사 결정 작업을 폴링할 때 Lambda 작업 수명 주기에 따라 조치를 취할 수 있는 여러 이벤트를 생성합니다. 이 이벤트는 EventType 값(예: LambdaFunctionScheduled
, LambdaFunctionStarted
및 LambdaFunctionCompleted
)으로 지정됩니다. Lambda 함수가 실패하거나 설정된 제한 시간 값보다 실행하는 데 더 오래 걸리면 각각 LambdaFunctionFailed
또는 LambdaFunctionTimedOut
이벤트 유형이 수신됩니다.
boolean function_completed = false; String result = null; System.out.println("Executing the decision task for the history events: ["); for (HistoryEvent event : events) { System.out.println(" " + event); EventType event_type = EventType.fromValue(event.getEventType()); switch(event_type) { case WorkflowExecutionStarted: workflow_input = event.getWorkflowExecutionStartedEventAttributes() .getInput(); break; case LambdaFunctionScheduled: scheduled_functions++; break; case ScheduleLambdaFunctionFailed: scheduled_functions--; break; case LambdaFunctionStarted: scheduled_functions--; running_functions++; break; case LambdaFunctionCompleted: running_functions--; function_completed = true; result = event.getLambdaFunctionCompletedEventAttributes() .getResult(); break; case LambdaFunctionFailed: running_functions--; break; case LambdaFunctionTimedOut: running_functions--; break;
Lambda 함수로부터 출력 수신
HistoryEvent에서 LambdaFunctionCompleted`EventType, you can retrieve your 0— function’s return value by first calling `getLambdaFunctionCompletedEventAttributes
를 수신하여 LambdaFunctionCompletedEventAttributes 객체를 가져온 다음 해당 getResult
메서드를 호출하여 Lambda 함수의 출력을 검색하는 경우:
LambdaFunctionCompleted: running_functions--;
이 예제의 전체 소스
Github의 aws-java-developer-guide 리포지토리에서 이 예제의 전체 소스 :github:`<awsdocs/aws-java-developer-guide/tree/master/doc_source/snippets/helloswf_lambda/>를 찾아볼 수 있습니다.