

 AWS SDK for Java 1.x는 2025년 12월 31일에 end-of-support되었습니다. 새로운 기능, 가용성 개선 및 보안 업데이트를 계속 받으려면 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html)로 마이그레이션하는 것이 좋습니다.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Lambda 작업
<a name="swf-lambda-task"></a>

Amazon SWF 활동의 대안으로 또는 이러한 활동과 함께, [Lambda](https://aws.amazon.com/lambda/) 함수를 사용하여 워크플로의 작업 단위를 표현하고 활동처럼 예약할 수 있습니다.

이 항목에서는 AWS SDK for Java를 사용하여 Amazon SWF Lambda 작업을 구현하는 방법을 중점적으로 설명합니다. Lambda 작업에 대한 자세한 내용은 Amazon SWF 개발자 안내서의 [AWS Lambda 작업](https://docs.aws.amazon.com/amazonswf/latest/developerguide/lambda-task.html)을 참조하세요.

## Lambda 함수를 실행하도록 교차 서비스 IAM 역할 설정
<a name="set-up-a-cross-service-iam-role-to-run-your-lambda-function"></a>

Amazon SWF에서 Lambda 함수를 실행하려면 먼저 사용자를 대신하여 Lambda 함수를 실행할 권한을 Amazon SWF에 부여하도록 IAM 역할을 설정해야 합니다. 이와 같이 설정하는 방법에 대한 자세한 내용은 [AWS Lambda 작업](https://docs.aws.amazon.com/amazonswf/latest/developerguide/lambda-task.html) 단원을 참조하세요.

Lambda 작업을 사용할 워크플로를 등록할 때 이 IAM 역할의 Amazon 리소스 이름(ARN)이 필요합니다.

## Lambda 함수 생성
<a name="create-a-lambda-function"></a>

Java를 비롯하여 다양한 언어로 Lambda 함수를 작성할 수 있습니다. Lambda 함수 작성, 배포 및 사용 방법에 대한 자세한 내용은 [AWS Lambda 개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하세요.

**참고**  
Lambda 함수를 작성하는 데 사용하는 언어와 무관합니다. 즉, 워크플로 코드의 작성 언어와 관계없이 *모든* Amazon SWF 워크플로에서 예약하고 실행할 수 있습니다. Amazon SWF는 함수 실행 및 함수와 주고받는 데이터 전달에 대한 세부 사항을 처리합니다.

다음은 [간단한 Amazon SWF 애플리케이션 구축](swf-hello.md) 작업 대신 사용할 수 있는 간단한 Lambda 함수입니다.
+ 이 버전은 JavaScript로 작성되었으며, [AWS Management Console](https://console.aws.amazon.com/console/home)을 사용하여 직접 입력할 수 있습니다.

  ```
  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)](https://docs.aws.amazon.com/lambda/latest/dg/lambda-java-how-to-create-deployment-package.html)을 참조하세요. 또한 [Java로 Lambda 함수를 작성하기 위한 프로그래밍 모델](https://docs.aws.amazon.com/lambda/latest/dg/java-programming-model.html) 단원을 살펴볼 수도 있습니다.

 Lambda 함수는 *event* 또는 *input* 객체를 첫 번째 매개 변수로 사용하고, *context* 객체를 두 번째 매개 변수로 사용하여 Lambda 함수 실행 요청에 대한 정보를 제공합니다. 이 특수한 함수에서는 입력이 JSON 형식이어야 하며, `who` 필드가 인사말을 생성하는 데 사용된 이름으로 설정되어야 합니다.

## Lambda에 사용할 워크플로 등록
<a name="register-a-workflow-for-use-with-lam"></a>

워크플로에서 Lambda 함수를 예약하려면 Amazon SWF 함수 호출 권한을 가진 권한을 Lambda에 제공하는 IAM 역할의 이름을 지정해야 합니다. [RegisterWorkflowTypeRequest](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/RegisterWorkflowTypeRequest.html)의 `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 작업 예약
<a name="schedule-a-lam-task"></a>

Lambda 작업 예약은 활동 예약과 비슷합니다. '스케줄 Lambda 함수' `ScheduleLambdaFunction`[DecisionType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/DecisionType.html) 및 [ScheduleLambdaFunctionDecisionAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/ScheduleLambdaFunctionDecisionAttributes.html)와 함께 [결정](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/Decision.html)을 제공합니다.

```
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](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/lambda/AWSLambdaClient.html)를 사용하여 Lambda 함수의 ARN을 가져옵니다. 이 기법을 사용하여 코드에서 전체 ARN(AWS 계정 ID 포함)가 하드코딩되는 것을 방지할 수 있습니다.

## 결정자에서 Lambda 함수 이벤트 처리
<a name="handle-lam-function-events-in-your-decider"></a>

 Lambda 작업은 워크플로 워커의 의사 결정 작업을 폴링할 때 Lambda 작업 수명 주기에 따라 조치를 취할 수 있는 여러 이벤트를 생성합니다. 이 이벤트는 [EventType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/EventType.html) 값(예: `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 함수로부터 출력 수신
<a name="receive-output-from-your-lam-function"></a>

[HistoryEvent](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/HistoryEvent.html)에서 `LambdaFunctionCompleted`[EventType](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/EventType.html), you can retrieve your 0 function’s return value by first calling `getLambdaFunctionCompletedEventAttributes`를 수신하여 [LambdaFunctionCompletedEventAttributes](https://docs.aws.amazon.com/sdk-for-java/v1/reference/com/amazonaws/services/simpleworkflow/model/LambdaFunctionCompletedEventAttributes.html) 객체를 가져온 다음 해당 `getResult` 메서드를 호출하여 Lambda 함수의 출력을 검색하는 경우:

```
 LambdaFunctionCompleted:
running_functions--;
```

## 이 예제의 전체 소스
<a name="complete-source-for-this-example"></a>

Github의 *aws-java-developer-guide* 리포지토리에서 이 예제의 *전체 소스 :github:`<awsdocs/aws-java-developer-guide/tree/master/doc\_source/snippets/helloswf\_lambda/>*를 찾아볼 수 있습니다.