사용자 지정 파일 처리 단계 사용 - AWS Transfer Family

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

사용자 지정 파일 처리 단계 사용

사용자 지정 파일 처리 단계를 사용하면 AWS Lambda을 사용하여 Bring Your Own 파일 처리 로직을 사용할 수 있습니다. 파일이 도착하면 Transfer Family 서버는 파일 암호화, 멀웨어 검사 또는 잘못된 파일 타입 검사와 같은 사용자 지정 파일 처리 로직이 포함된 Lambda 함수를 간접적으로 호출합니다. 다음 예시에서는 대상 AWS Lambda 함수를 사용하여 이전 단계의 출력 파일을 처리합니다.

참고

Lambda 함수의 예는 사용자 지정 워크플로 단계를 위한 Lambda 함수 예를 참조하세요. 예를 들어 이벤트(Lambda로 전달된 파일의 위치 포함)는 파일 업로드 AWS Lambda 시 로 전송된 이벤트 예를 참조하세요.

사용자 지정 워크플로 단계를 사용하면 SendWorkflowStepState API 작업을 호출하도록 Lambda 함수를 구성해야 합니다. 는 단계가 성공 또는 실패 상태로 완료되었음을 워크플로 실행에 SendWorkflowStepState 알립니다. SendWorkflowStepState API 작업 상태는 Lambda 함수의 결과를 기반으로 예외 핸들러 단계 또는 선형 시퀀스의 명목 단계를 호출합니다.

Lambda 함수가 실패하거나 시간이 초과되면 단계가 실패하고 CloudWatch 로그StepErrored에 이 표시됩니다. Lambda 함수가 공칭 단계의 일부이고 함수가 Status="FAILURE"SendWorkflowStepState에 응답하거나 제한 시간이 초과되면 흐름은 예외 처리 단계로 계속됩니다. 이 경우 워크플로는 나머지(있는 경우) 공칭 단계를 계속 실행하지 않습니다. 자세한 내용은 워크플로의 예외 처리를 참조하세요.

SendWorkflowStepState API 작업을 호출할 때 다음 파라미터를 전송해야 합니다.

{ "ExecutionId": "string", "Status": "string", "Token": "string", "WorkflowId": "string" }

Lambda 함수가 실행될 때 전달되는 입력 이벤트에서 ExecutionId, Token, 및 WorkflowId를 추출할 수 있습니다(예는 다음 섹션에 표시됨). 이때 Status 값은 SUCCESS 또는 FAILURE가 될 수 있습니다.

Lambda 함수에서 SendWorkflowStepState API 작업을 호출하려면 관리형 워크플로가 AWS SDK 도입된 후 게시된 버전의 를 사용해야 합니다.

여러 Lambda 함수를 연속적으로 사용

여러 사용자 지정 단계를 차례로 사용하는 경우 파일 위치 옵션은 단일 사용자 지정 단계만 사용하는 경우와 다르게 작동합니다. Transfer Family는 Lambda 처리 파일을 다음 단계의 입력으로 사용하기 위해 다시 전달하는 것을 지원하지 않습니다. 따라서 previous.file 옵션을 사용하도록 구성된 사용자 지정 단계가 여러 개 있는 경우 모두 동일한 파일 위치(첫 번째 사용자 지정 단계의 입력 파일 위치)를 사용합니다.

참고

사용자 지정 단계 이후에 사전 정의된 단계(태그 지정, 복사, 복호화 또는 삭제)가 있는 경우에도 previous.file 설정이 다르게 작동합니다. 사전 정의된 단계가 previous.file 설정을 사용하도록 구성된 경우 사전 정의된 단계는 사용자 정의 단계에서 사용한 것과 동일한 입력 파일을 사용합니다. 사용자 정의 단계에서 처리된 파일은 사전 정의된 단계로 전달되지 않습니다.

사용자 정의 처리 후 파일에 액세스

Amazon S3를 스토리지로 사용하고 있고 워크플로에 원래 업로드된 파일에서 작업을 수행하는 사용자 지정 단계가 포함되어 있는 경우, 후속 단계에서 처리된 파일에 액세스할 수 없습니다. 즉, 사용자 지정 단계 이후의 모든 단계는 사용자 지정 단계 출력의 업데이트된 파일을 참조할 수 없습니다.

예를 들어 워크플로에 다음과 같은 세 단계가 있다고 가정하겠습니다.

  • 1단계example-file.txt라는 이름의 파일을 업로드합니다.

  • 2단계 — 어떤 식으로든 example-file.txt를 변경하는 Lambda 함수를 간접적으로 호출합니다.

  • 3단계example-file.txt의 업데이트된 버전에서 추가 처리를 시도합니다.

3단계에 대한 sourceFileLocation${original.file}로 구성한 경우 3단계에서는 1단계에서 서버가 스토리지에 파일을 업로드한 시점의 원래 파일 위치를 사용합니다. 3단계에서 ${previous.file}을 사용하는 경우 3단계에서는 2단계에서 입력으로 사용한 파일 위치를 다시 사용합니다.

따라서 3단계에서 오류가 발생합니다. 예를 들어 3단계에서 업데이트된 example-file.txt를 복사하려고 하면 다음과 같은 오류 메시지가 나타납니다.

{ "type": "StepErrored", "details": { "errorType": "NOT_FOUND", "errorMessage": "ETag constraint not met (Service: null; Status Code: 412; Error Code: null; Request ID: null; S3 Extended Request ID: null; Proxy: null)", "stepType": "COPY", "stepName": "CopyFile" },

이 오류는 사용자 지정 단계가 의 엔터티 태그(ETag)를 수정example-file.txt하여 원본 파일과 일치하지 않도록 하기 때문에 발생합니다.

참고

Amazon은 엔터티 태그를 사용하여 파일을 식별하지 않기 EFS 때문에 Amazon을 사용하는 경우에는 이 동작이 발생하지 EFS 않습니다.

파일 업로드 AWS Lambda 시 로 전송된 이벤트 예

다음 예제에서는 파일 업로드가 완료될 AWS Lambda 때 로 전송되는 이벤트를 보여줍니다. 한 예로, 도메인이 Amazon S3으로 구성된 Transfer Family 서버를 사용합니다. 다른 예제에서는 도메인이 Amazon 를 사용하는 Transfer Family 서버를 사용합니다EFS.

Custom step that uses an Amazon S3 domain
{ "token": "MzI0Nzc4ZDktMGRmMi00MjFhLTgxMjUtYWZmZmRmODNkYjc0", "serviceMetadata": { "executionDetails": { "workflowId": "w-1234567890example", "executionId": "abcd1234-aa11-bb22-cc33-abcdef123456" }, "transferDetails": { "sessionId": "36688ff5d2deda8c", "userName": "myuser", "serverId": "s-example1234567890" } }, "fileLocation": { "domain": "S3", "bucket": "DOC-EXAMPLE-BUCKET", "key": "path/to/mykey", "eTag": "d8e8fca2dc0f896fd7cb4cb0031ba249", "versionId": null } }
Custom step that uses an Amazon EFS domain
{ "token": "MTg0N2Y3N2UtNWI5Ny00ZmZlLTk5YTgtZTU3YzViYjllNmZm", "serviceMetadata": { "executionDetails": { "workflowId": "w-1234567890example", "executionId": "abcd1234-aa11-bb22-cc33-abcdef123456" }, "transferDetails": { "sessionId": "36688ff5d2deda8c", "userName": "myuser", "serverId": "s-example1234567890" } }, "fileLocation": { "domain": "EFS", "fileSystemId": "fs-1234567", "path": "/path/to/myfile" } }

사용자 지정 워크플로 단계를 위한 Lambda 함수 예

다음 Lambda 함수는 실행 상태에 대한 정보를 추출한 다음 SendWorkflowStepState API 작업을 호출하여 또는 단계의 워크플로로 상태를 반환합니다SUCCESSFAILURE. 함수가 SendWorkflowStepState API 작업을 호출하기 전에 워크플로 로직을 기반으로 작업을 수행하도록 Lambda를 구성할 수 있습니다.

import json import boto3 transfer = boto3.client('transfer') def lambda_handler(event, context): print(json.dumps(event)) # call the SendWorkflowStepState API to notify the workflow about the step's SUCCESS or FAILURE status response = transfer.send_workflow_step_state( WorkflowId=event['serviceMetadata']['executionDetails']['workflowId'], ExecutionId=event['serviceMetadata']['executionDetails']['executionId'], Token=event['token'], Status='SUCCESS|FAILURE' ) print(json.dumps(response)) return { 'statusCode': 200, 'body': json.dumps(response) }

IAM 사용자 지정 단계에 대한 권한

Lambda를 직접적으로 호출하는 단계가 성공하도록 허용하려면 워크플로의 실행 역할에 다음 권한이 포함되어 있어야 합니다.

{ "Sid": "Custom", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": [ "arn:aws:lambda:region:account-id:function:function-name" ] }