

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

# AWS Lambda 작업 구현
<a name="lambda-task"></a>

**Topics**
+ [정보 AWS Lambda](#about-aws-lambda)
+ [Lambda 작업 사용의 이점 및 제한 사항](#benefits-limitations-lambda-tasks)
+ [AWS Flow Framework for Java 워크플로에서 Lambda 작업 사용](#using-lambda-tasks-in-java-flow-workflows)
+ [HelloLambda 샘플 보기](#see-lambda-sample)

## 정보 AWS Lambda
<a name="about-aws-lambda"></a>

AWS Lambda 는 사용자 지정 코드 또는 Amazon S3, DynamoDB, Amazon Kinesis, Amazon SNS, Amazon Cognito와 같은 다양한 서비스에서 생성된 이벤트에 대한 응답으로 코드를 실행하는 완전관리형 컴퓨팅 AWS 서비스입니다. Lambda에 대한 자세한 내용은 [AWS Lambda 개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하세요.

Amazon Simple Workflow Service는 Lambda 작업을 제공하므로 기존 Amazon SWF 활동 대신 또는 이러한 활동과 함께 Lambda 함수를 실행할 수 있습니다.

**중요**  
Amazon SWF가 사용자를 대신하여 실행하는 Lambda 실행(요청)에 대해 AWS 계정에 요금이 부과됩니다. Lambda 요금에 대한 자세한 내용은 [https://aws.amazon.com/lambda/pricing/](https://aws.amazon.com/lambda/pricing/) 참조하십시오.

## Lambda 작업 사용의 이점 및 제한 사항
<a name="benefits-limitations-lambda-tasks"></a>

일반적인 Amazon SWF 활동 대신 Lambda 작업을 사용하면 다음과 같은 여러 가지 이점이 있습니다.
+ Lambda 작업은 Amazon SWF 활동 유형처럼 등록하거나 버전을 관리할 필요가 없습니다.
+ 워크플로에 이미 정의해 둔 기존 Lambda 함수는 어느 것이나 사용할 수 있습니다.
+ Lambda 함수는 Amazon SWF에서 직접 호출하기 때문에 일반적인 활동에 대해 수행해야 하는 것처럼 작업을 실행할 작업자 프로그램을 구현할 필요가 없습니다.
+ Lambda에서는 함수 실행을 추적 및 분석할 수 있도록 측정치 및 로그를 제공합니다.

또한 Lambda 작업과 관련해서는 반드시 알고 있어야 하는 여러 가지 제한 사항이 있습니다.
+ Lambda 태스크는 Lambda에 대한 지원을 제공하는 AWS 리전에서만 실행할 수 있습니다. 현재 Lambda를 지원하는 리전에 대한 자세한 내용은 *Amazon Web Services 일반 참조*의 [Lambda 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#lambda_region)를 참조하십시오.
+ Lambda 작업은 현재 기본 SWF HTTP API 및 Java AWS Flow Framework 용 에서만 지원됩니다. 현재 for AWS Flow Framework Ruby에서는 Lambda 작업을 지원하지 않습니다.

## AWS Flow Framework for Java 워크플로에서 Lambda 작업 사용
<a name="using-lambda-tasks-in-java-flow-workflows"></a>

Java용 워크플로에서 Lambda 작업을 사용하기 AWS Flow Framework 위한 세 가지 요구 사항이 있습니다.
+ 실행할 Lambda 함수입니다. 정의한 Lambda 함수를 자유롭게 사용할 수 있습니다. Lambda 함수를 생성하는 방법에 대한 자세한 내용은 [AWS Lambda 개발자 안내서](https://docs.aws.amazon.com/lambda/latest/dg/)를 참조하십시오.
+ Amazon SWF 워크플로에서 Lambda 함수를 실행할 수 있도록 액세스 권한을 제공하는 IAM 역할.
+ 워크플로 내에서 Lambda 작업을 예약할 수 있는 코드.

### IAM 역할 설정
<a name="set-up-lambda-role"></a>

Amazon SWF에서 Lambda 함수를 간접적으로 호출하려면 Amazon SWF에서 Lambda에 대한 액세스를 제공하는 IAM 역할을 제공해야 합니다. 다음 작업 중 하나를 수행할 수 있습니다.
+ 사전 정의된 역할인 *AWSLambdaRole*을 선택해 워크플로에 계정과 연결된 모든 Lambda 함수를 간접적으로 호출할 수 있는 권한을 부여합니다.
+ 자체 정책 및 연결된 역할을 정의해 Amazon 리소스 이름(ARN)으로 지정된 특정 Lambda 함수를 간접적으로 호출하는 워크플로 권한을 부여합니다.

#### IAM 역할에 대한 권한 제한
<a name="limit-iam-role-permissions"></a>

리소스 신뢰 정책의 `SourceArn` 및 `SourceAccount` 컨텍스트 키를 사용하여 Amazon SWF에 제공하는 IAM 역할에 대한 권한을 제한할 수 있습니다. 이러한 키는 지정된 도메인 ARN에 속하는 Amazon Simple Workflow Service 실행에서만 사용하도록 IAM 정책의 사용을 제한합니다. 두 글로벌 조건 컨텍스트 키를 모두 사용하는 경우 `aws:SourceAccount` 값과 `aws:SourceArn` 값에서 참조되는 계정은 동일한 정책 문에서 사용할 경우 동일한 계정 ID를 사용해야 합니다.

다음 예제에서 `SourceArn` 컨텍스트 키는 계정에 속한 Amazon Simple Workflow Service 실행에서만 IAM 서비스 역할을 사용하도록 제한합니다`someDomain``123456789012`.


+ **문 1**

  **보안 주체**: `"Service": "swf.amazonaws.com"` 

  **작업:** `sts:AssumeRole` 

```
"Condition": {
   "ArnLike": {
     "aws:SourceArn": "arn:aws:swf:*:123456789012:/domain/someDomain"
   }
}
```

다음 예제에서 `SourceAccount` 컨텍스트 키는 계정의 Amazon Simple Workflow Service 실행에서만 IAM 서비스 역할을 사용하도록 제한합니다`123456789012`.

```
"Condition": {
   "StringLike": {
     "aws:SourceAccount": "123456789012"
   }
}
```

#### Amazon SWF에 Lambda 역할을 간접 호출하기 위한 액세스 권한 제공
<a name="providing-swf-access-invoke-any-lambda-role"></a>

사전 정의된 역할인 *AWSLambdaRole*을 사용해 Amazon SWF 워크플로에 계정과 연결된 모든 Lambda 함수를 간접적으로 호출할 수 있는 권한을 부여합니다.

**AWSLambdaRole을 사용해 Amazon SWF에 Lambda 함수를 간접적으로 호출할 수 있는 액세스 권한을 부여하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Roles**]를 선택한 다음 [**Create New Role**]을 선택합니다.

1. `swf-lambda`와 같이 역할에 이름을 지정한 다음 [**Next Step**]을 선택합니다.

1. **AWS 서비스 역할**에서 **Amazon SWF**를 선택하고 **다음 단계**를 선택합니다.

1. **정책 연결** 화면의 목록에서 **AWSLambdaRole**을 선택합니다.

1. 역할을 검토한 후 [**Next Step**]을 선택하고 [**Create Role**]을 선택합니다.

#### 특정 Lambda 함수를 간접 호출할 액세스 권한을 제공하는 IAM 역할 정의
<a name="defining-iam-role-provide-access-invoke-specific-lambda-function"></a>

워크플로에서 특정 Lambda 함수를 간접적으로 호출하는 액세스 권한을 제공하려는 경우 자체 IAM 정책을 정의해야 합니다.

**특정 Lambda 함수에 대한 액세스 권한을 부여하는 IAM 정책을 생성하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Policies**]를 선택한 다음 [**Create Policy**]를 선택합니다.

1. ** AWS 관리형 정책 복사를** 선택하고 목록에서 **AWSLambdaRole**을 선택합니다. 정책이 자동으로 생성됩니다. 경우에 따라 필요에 맞춰 정책 이름 및 설명을 편집합니다.

1. **정책 문서**의 *리소스* 필드에 Lambda 함수의 ARN을 추가합니다. 예:
   + **리소스:** `arn:aws:lambda:us-east-1:111122223333:function:hello_lambda_function` 
**참고**  
IAM 역할에서 리소스를 지정하는 방법에 대한 전체 설명은 *IAM 사용*의 [IAM 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)를 참조하십시오.

1. [**Create policy**]를 선택하여 정책 생성을 마칩니다.

그런 다음 새 IAM 역할을 생성할 때 이 정책을 선택하고 해당 역할을 사용해 Amazon SWF 워크플로에 간접 호출 액세스 권한을 부여합니다. 이 절차는 *AWSLambdaRole* 정책을 사용해 역할을 생성하는 것과 매우 유사합니다. 대신 역할을 생성할 때 고유한 정책을 선택합니다.

**Lambda 정책을 사용하여 Amazon SWF 역할을 생성하려면**

1. [Amazon IAM 콘솔](https://console.aws.amazon.com/iam/)을 엽니다.

1. [**Roles**]를 선택한 다음 [**Create New Role**]을 선택합니다.

1. `swf-lambda-function`와 같이 역할에 이름을 지정한 다음 [**Next Step**]을 선택합니다.

1. **AWS 서비스 역할**에서 **Amazon SWF**를 선택하고 **다음 단계**를 선택합니다.

1. **정책 연결** 화면의 목록에서 Lambda 함수 관련 정책을 선택합니다.

1. 역할을 검토한 후 [**Next Step**]을 선택하고 [**Create Role**]을 선택합니다.

### 실행을 위해 Lambda 작업을 예약하려면
<a name="schedule-lambda-tasks-for-execution"></a>

Lambda 함수를 간접적으로 호출할 수 있게 해주는 IAM 역할을 정의했다면 이 함수가 워크플로의 일부로 실행되도록 예약할 수 있습니다.

**참고**  
이 프로세스는 AWS SDK for Java의 [HelloLambda 샘플](#see-lambda-sample)을 통해 완전히 입증되었습니다.

**실행을 위해 Lambda 작업을 예약하려면**

1. 워크플로 구현에서 `DecisionContext` 인스턴스의 `getLambdaFunctionClient()`를 직접적으로 호출하여 `LambdaFunctionClient`의 인스턴스를 얻습니다.

   ```
   // Get a LambdaFunctionClient instance
   DecisionContextProvider decisionProvider = new DecisionContextProviderImpl();
   DecisionContext decisionContext = decisionProvider.getDecisionContext();
   LambdaFunctionClient lambdaClient = decisionContext.getLambdaFunctionClient();
   ```

1. `LambdaFunctionClient`의 `scheduleLambdaFunction()` 메서드를 사용하여 작업을 예약하고 생성한 Lambda 함수의 이름과 Lambda 작업을 위한 모든 입력 데이터를 전달합니다.

   ```
   // Schedule the Lambda function for execution, using your IAM role for access.
   String lambda_function_name = "The name of your Lambda function.";
   String lambda_function_input = "Input data for your Lambda task.";
   
   lambdaClient.scheduleLambdaFunction(lambda_function_name, lambda_function_input);
   ```

1. 워크플로 실행 시작자에서 `StartWorkflowOptions.withLambdaRole()`을 사용하여 IAM Lambda 역할을 기본 워크플로 옵션에 추가한 후 이 워크플로를 시작할 때 옵션을 전달합니다.

   ```
   // Workflow client classes are generated for you when you use the @Workflow
   // annotation on your workflow interface declaration.
   MyWorkflowClientExternalFactory clientFactory =
     new MyWorkflowClientExternalFactoryImpl(sdk_swf_client, swf_domain);
   
   MyWorkflowClientExternal workflow_client = clientFactory.getClient();
   
   // Give the ARN of an IAM role that allows SWF to invoke Lambda functions on
   // your behalf.
   String lambda_iam_role = "arn:aws:iam::111111000000:role/swf_lambda_role";
   
   StartWorkflowOptions workflow_options =
     new StartWorkflowOptions().withLambdaRole(lambda_iam_role);
   
   // Start the workflow execution
   workflow_client.helloWorld("User", workflow_options);
   ```

## HelloLambda 샘플 보기
<a name="see-lambda-sample"></a>

Lambda 작업을 사용하는 워크플로의 구현을 제공하는 샘플은 AWS SDK for Java에서 제공됩니다. 이 샘플을 보거나 실행하려면 [소스를 다운로드](https://aws.amazon.com/code/3015904745387737)하십시오.

*HelloLambda* 샘플을 빌드하고 실행하는 방법에 대한 전체 설명은 AWS Flow Framework for Java 샘플과 함께 제공된 README 파일에 나와 있습니다.