

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

# AWS Transfer Family 관리형 워크플로
<a name="transfer-workflows"></a>

 AWS Transfer Family 는 파일 처리를 위한 관리형 워크플로를 지원합니다. 관리형 워크플로를 사용하면 SFTP, FTPS 또는 FTP를 통해 파일이 전송된 후 워크플로를 시작할 수 있습니다. 이 기능을 사용하면 파일 처리에 필요한 모든 단계를 조정하여 B2B(Business-to-Business) 파일 교환에 대한 규정 준수 요구 사항을 안전하고 비용 효율적으로 충족할 수 있습니다. 뿐만 아니라 엔드 투 엔드 감사 및 가시성의 이점을 활용할 수 있습니다.

![\[관리형 워크플로가 파일 처리를 어떻게 지원하는지 보여주는 흐름도.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-diagram.png)


관리형 워크플로는 파일 처리 작업을 오케스트레이션하여 다운스트림 애플리케이션에서 데이터를 사용하기 전에 데이터를 사전 처리하는 데 도움이 됩니다. 이러한 파일 처리 작업에는 다음이 포함될 수 있습니다.
+ 파일을 사용자별 폴더로 이동.
+ 워크플로의 일부로 파일 복호화.
+ 파일 태그 지정.
+  AWS Lambda 함수를 생성하고 워크플로에 연결하여 사용자 지정 처리를 수행합니다.
+ 파일이 성공적으로 전송되면 알림을 보냅니다. (이 사용 사례를 자세히 설명하는 블로그 게시물은 [AWS Transfer Family 관리형 워크플로를 사용하여 파일 전송 알림 사용자 지정](https://aws.amazon.com/blogs/storage/customize-file-delivery-notifications-using-aws-transfer-family-managed-workflows/)을 참조하세요.)

조직 내 여러 사업부에 걸쳐 있는 일반적인 업로드 후 파일 처리 작업을 빠르게 복제하고 표준화하려면 코드형 인프라(IaC)를 사용하여 워크플로를 배포할 수 있습니다. 전체 업로드된 파일에 대해 관리형 워크플로를 시작하도록 지정할 수 있습니다. 또한 세션이 조기에 끊어져 일부만 업로드된 파일에 대해 다른 관리형 워크플로를 시작하도록 지정할 수 있습니다. 기본 제공되는 예외 처리 기능을 통해 파일 처리 결과에 신속하게 대응하는 동시에 오류 처리 방법을 제어할 수 있습니다. 또한 각 워크플로 단계는 세부 로그를 생성하며, 이를 감사하여 데이터 계보를 추적할 수 있습니다.

시작하려면 다음 단계를 수행합니다.

1. 요구 사항에 따라 복사, 태그 지정 및 기타 단계와 같은 사전 처리 작업을 포함하도록 워크플로를 설정합니다. 세부 정보는 [워크플로 만들기](create-workflow.md)를 참조하세요.

1. Transfer Family가 워크플로를 실행하는 데 사용하는 실행 역할을 구성합니다. 세부 정보는 [워크플로에 대한 IAM 정책](workflow-execution-role.md)를 참조하세요.

1. 워크플로를 서버에 매핑하여 파일 도착 시 이 워크플로에 지정된 작업이 실시간으로 평가 및 시작되도록 합니다. 세부 정보는 [워크플로 구성 및 실행](create-workflow.md#configure-workflow)를 참조하세요.

**관련 정보**
+ 워크플로 실행을 모니터링하려면 [Transfer Family 서버에 CloudWatch 지표 사용](metrics.md)를 참조하세요.
+ 자세한 실행 로그 및 문제 해결 정보는 [Amazon CloudWatch를 사용하여 워크플로 관련 오류를 해결합니다.](workflow-issues.md#workflows-cloudwatch-errors)를 참조하세요.
+ Transfer Family는 파일 전송 솔루션 구축을 안내하는 블로그 게시물과 워크숍을 제공합니다. 이 솔루션은 관리형 SFTP/FTPS 엔드포인트 AWS Transfer Family 에를 활용하고 사용자 관리를 위해 Amazon Cognito 및 DynamoDB를 활용합니다.

  블로그 게시물은 [AWS Transfer Family 및 Amazon S3에서 자격 증명 공급자로 Amazon Cognito 사용에서 확인할 수 있습니다Amazon S3](https://aws.amazon.com/blogs/storage/using-amazon-cognito-as-an-identity-provider-with-aws-transfer-family-and-amazon-s3/). 여기에서 워크숍에 대한 세부 정보를 볼 수 [있습니다](https://catalog.workshops.aws/transfer-family-sftp/en-US).
+ 다음 동영상은 Transfer Family 관리형 워크플로를 간략하게 소개합니다.  
[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/t-iNqCRospw/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/t-iNqCRospw)
+ 다음 워크숍은 실습을 통해 외부 SFTP 서버와 Amazon S3 간의 파일 전송 및 해당 파일의 일반적인 사전 및 사후 처리와 관련된 완전 자동화된 이벤트 기반 워크플로인 [이벤트 기반 MFT 워크숍](https://catalog.us-east-1.prod.workshops.aws/workshops/e55c90e0-bbb0-47e1-be83-6bafa3a59a8a/en-US)을 구축합니다.

  이 동영상에서는이 워크숍을 안내합니다.  
[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/oojopisG4lA/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/oojopisG4lA)

**Topics**
+ [워크플로 만들기](create-workflow.md)
+ [사전 정의된 단계 사용](nominal-steps-workflow.md)
+ [사용자 지정 파일 처리 단계 사용](custom-step-details.md)
+ [워크플로에 대한 IAM 정책](workflow-execution-role.md)
+ [워크플로의 예외 처리](#exception-workflow)
+ [워크플로 실행 모니터링](cloudwatch-workflow.md)
+ [템플릿에서 워크플로 생성](workflow-template.md)
+ [Transfer Family 서버에서 워크플로 제거](#remove-workflow-association)
+ [관리형 워크플로 제한 및 제약 조건](#limitations-workflow)

관리형 워크플로를 시작하는 데 도움이 더 필요하면 다음 리소스를 참조하세요.
+ [AWS Transfer Family 관리형 워크플로](https://www.youtube.com/watch?v=t-iNqCRospw) 데모 비디오
+ [AWS Transfer Family 워크플로를 사용하여 클라우드 네이티브 파일 전송 플랫폼 구축](https://aws.amazon.com/blogs/architecture/building-a-cloud-native-file-transfer-platform-using-aws-transfer-family-workflows/) 블로그 게시물

# 워크플로 만들기
<a name="create-workflow"></a>

이 주제에 설명된 AWS Management Console대로를 사용하여 관리형 워크플로를 생성할 수 있습니다. 워크플로를 가능한 한 쉽게 만들기 위해 콘솔의 대부분의 섹션에서 상황별 도움말 패널을 사용할 수 있습니다.

워크플로에는 다음과 같은 두 가지 단계가 있습니다.
+ **공칭 단계** - 공칭 단계는 들어오는 파일에 적용할 파일 처리 단계입니다. 공칭 단계를 두 개 이상 선택한 경우 각 단계는 선형 시퀀스로 처리됩니다.
+ **예외 처리 단계** - 예외 핸들러는 공칭 단계가 실패하거나 검증 오류가 발생할 경우 AWS Transfer Family 실행되는 파일 처리 단계입니다.

**워크플로 만들기**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) AWS Transfer Family 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **워크플로**를 선택합니다.

1. **워크플로** 페이지에서 **워크플로 생성**을 선택합니다.

1. **워크플로 생성** 페이지에서 설명을 입력합니다. 이 설명은 **워크플로** 페이지에 표시됩니다.

1. **공칭 단계** 섹션에서 **단계 추가**를 선택합니다. 단계를 하나 이상 추가합니다.

   1. 사용 가능한 옵션에서 단계 타입을 선택합니다. 다양한 단계 타입에 대한 자세한 내용은 [사전 정의된 단계 사용](nominal-steps-workflow.md)를 참조하세요.

   1. **다음**을 선택한 다음 해당 단계에 대한 파라미터를 구성합니다.

   1. **다음**을 선택한 다음 해당 단계에 대한 세부 정보를 검토합니다.

   1. **단계 생성**을 선택하여 단계를 추가하고 계속합니다.

   1. 필요에 따라 단계를 계속 추가합니다. 워크플로의 최대 단계 수는 8개입니다.

   1. 필요한 공칭 단계를 모두 추가한 후 **예외 처리기 — *옵션*** 섹션으로 아래로 스크롤하여 **단계 추가**를 선택합니다.
**참고**  
실패 알림을 실시간으로 받을 수 있도록 워크플로가 실패할 때 실행할 예외 처리기와 단계를 설정하는 것이 좋습니다.

1. 예외 처리기를 구성하려면 앞에서 설명한 것과 같은 방식으로 단계를 추가하세요. 파일로 인해 특정 단계에서 예외가 발생하는 경우 예외 처리기가 하나씩 간접적으로 호출됩니다.

1. (옵션) **태그** 섹션으로 스크롤하여 워크플로에 사용할 태그를 추가합니다.

1. 플릿 구성을 살펴본 후 **워크플로 생성**을 선택합니다.
**중요**  
워크플로를 만든 후에는 편집할 수 없으므로 구성을 주의 깊게 검토해야 합니다.

## 워크플로 구성 및 실행
<a name="configure-workflow"></a>

워크플로를 실행하려면 먼저 Transfer Family 서버에 연결해야 합니다.

**업로드된 파일에서 워크플로를 실행하도록 Transfer Family를 구성하려면**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) AWS Transfer Family 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **서버**를 선택합니다.
   + 기존 서버에 워크플로를 추가하려면 워크플로에 사용할 서버를 선택합니다.
   + 또는 새 서버를 만들고 이 서버에 워크플로를 추가할 수도 있습니다. 자세한 내용은 [SFTP, FTPS 또는 FTP 서버 엔드포인트 구성](tf-server-endpoint.md) 단원을 참조하십시오.

1. 서버의 세부 정보 페이지에서 **추가 세부 정보** 섹션까지 아래로 스크롤한 다음 **편집**을 선택합니다.
**참고**  
 기본적으로 서버에는 연결된 워크플로가 없습니다. **추가 세부 정보** 섹션을 사용하여 워크플로를 선택한 서버에 연결할 수 있습니다.

1. **추가 세부 정보 편집** 페이지의 **관리형 워크플로** 섹션에서 모든 업로드에서 실행할 워크플로를 선택합니다.
**참고**  
워크플로가 아직 없는 경우 **새 워크플로 생성**을 선택하여 워크플로를 생성합니다.

   1. 사용할 워크플로 ID를 선택합니다.

   1. 실행 역할을 선택합니다. 이 역할은 워크플로의 단계를 실행할 때 Transfer Family가 맡는 역할입니다. 자세한 내용은 [워크플로에 대한 IAM 정책](workflow-execution-role.md)를 참조하세요. **저장**을 선택합니다.  
![\[워크플로 및 실행 역할의 값을 보여주는 관리형 워크플로 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-addtoserver.png)

**참고**  
워크플로를 더 이상 서버와 연결하지 않으려면 연결을 제거하면 됩니다. 자세한 내용은 [Transfer Family 서버에서 워크플로 제거](transfer-workflows.md#remove-workflow-association)를 참조하세요.

**워크플로를 실행하려면**

워크플로를 실행하려면 관련 워크플로로 구성한 Transfer Family 서버에 파일을 업로드합니다.

**참고**  
서버에서 워크플로를 제거하고 새 워크플로로 바꾸거나 워크플로의 실행 역할에 영향을 미치는 서버 구성을 업데이트할 때마다 새 워크플로를 실행하기 전에 약 10분을 기다려야 합니다. Transfer Family 서버는 워크플로 세부 정보를 캐시하며 서버가 캐시를 새로 고치는 데 10분이 걸립니다.  
또한 활성 SFTP 세션에서 로그아웃한 다음 10분 대기 시간이 지난 후 다시 로그인해야 변경 사항을 확인할 수 있습니다.

**Example**  

```
# Execute a workflow
> sftp bob@s-1234567890abcdef0.server.transfer.us-east-1.amazonaws.com

Connected to s-1234567890abcdef0.server.transfer.us-east-1.amazonaws.com.
sftp> put doc1.pdf
Uploading doc1.pdf to /amzn-s3-demo-bucket/home/users/bob/doc1.pdf
doc1.pdf                                                                    100% 5013KB 601.0KB/s   00:08    
sftp> exit
>
```

파일이 업로드되고 나면 파일에 정의된 작업이 수행됩니다. 예를 들어 워크플로에 복사 단계가 포함된 경우 해당 단계에서 정의한 위치에 파일이 복사됩니다. Amazon CloudWatch Logs를 사용하여 실행된 단계와 실행 상태를 추적할 수 있습니다.

## 워크플로 세부 정보 보기
<a name="view-details-workflow"></a>

이전에 만든 워크플로 또는 워크플로 실행에 대한 세부 정보를 볼 수 있습니다. 이러한 세부 정보를 보려면 콘솔 또는 AWS Command Line Interface ()를 사용할 수 있습니다AWS CLI.

------
#### [ Console ]

**워크플로 세부 정보 보기**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) AWS Transfer Family 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **워크플로**를 선택합니다.

1. **워크플로** 페이지에서 워크플로를 선택합니다.

   워크플로 세부 정보 페이지가 열립니다.  
![\[설명, 단계, 예외 핸들러 및 진행 중인 실행을 보여주는 Transfer Family 워크플로의 워크플로 세부 정보 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-overview.png)

------
#### [ CLI ]

워크플로 세부 정보를 보려면 다음 예에서와 같이 `describe-workflow` CLI 명령을 사용합니다. 워크플로 ID `w-1234567890abcdef0`를 사용자의 고유한 값으로 바꿉니다. 자세한 내용은 *AWS CLI 명령 참조*에서 [describe-workflow](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/transfer/describe-workflow.html)를 참조하세요.

```
# View Workflow details
> aws transfer describe-workflow --workflow-id w-1234567890abcdef0
{
    "Workflow": {
        "Arn": "arn:aws:transfer:us-east-1:111122223333:workflow/w-1234567890abcdef0",
        "WorkflowId": "w-1234567890abcdef0",
        "Name": "Copy file to shared_files",
        "Steps": [
            {
                "Type": "COPY",
                "CopyStepDetails": {
                "Name": "Copy to shared",
                "FileLocation": {
                    "S3FileLocation": {
                        "Bucket": "amzn-s3-demo-bucket",
                        "Key": "home/shared_files/"
                    }
                }
                }
            }
        ],
        "OnException": {}
    }
}
```

------

워크플로가 AWS CloudFormation 스택의 일부로 생성된 경우 CloudFormation 콘솔([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))을 사용하여 워크플로를 관리할 수 있습니다.

![\[스택의 AWS CloudFormation 일부인 워크플로에 대한 워크플로 세부 정보 화면에는 CloudFormation에서이 워크플로를 관리한다는 메시지가 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-cloudformation-link.png)


# 사전 정의된 단계 사용
<a name="nominal-steps-workflow"></a>

워크플로를 만들 때 이 항목에 설명된 다음과 같은 사전 정의된 단계 중 하나를 추가하도록 선택할 수 있습니다. 또한 사용자 지정 파일 처리 단계 추가를 선택할 수도 있습니다. 자세한 내용은 [사용자 지정 파일 처리 단계 사용](custom-step-details.md)를 참조하세요.

**Topics**
+ [파일 복사](#copy-step-details)
+ [파일 복호화](#decrypt-step-details)
+ [파일 태그 지정](#tag-step-details)
+ [파일 삭제](#delete-step-details)
+ [워크플로에 명명된 변수](#workflow-named-variables)
+ [태그 및 삭제 워크플로 예시](#sourcefile-workflow)

## 파일 복사
<a name="copy-step-details"></a>

파일 복사 단계는 업로드된 파일의 사본을 새 Amazon S3 위치에 생성합니다. 현재는 Amazon S3에서만 파일 복사 단계를 사용할 수 있습니다.

다음 파일 복사 단계는 파일을 *amzn-s3-demo-destination-bucket*의 `test` 폴더에 복사합니다.

파일 복사 단계가 워크플로의 첫 단계가 아닌 경우 **파일 위치**를 지정할 수 있습니다. 파일 위치를 지정하면 이전 단계에서 사용한 파일 또는 업로드된 원본 파일을 복사할 수 있습니다. 이 기능을 사용하면 파일 보관 및 기록 보존을 위해 원본 파일을 그대로 유지하면서 원본 파일의 사본을 여러 개 만들 수 있습니다. 예는 [태그 및 삭제 워크플로 예시](#sourcefile-workflow)를 참조하세요.

![\[이전 단계에서 생성한 파일 복사... 버튼이 선택된 워크플로 화면.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-copy.png)


### 버킷 및 키 세부 정보 제공
<a name="copy-provide-bucket"></a>

파일 복사 단계의 대상 버킷 이름과 키를 제공해야 합니다. 키는 경로 이름 또는 파일 이름일 수 있습니다. 키를 경로 이름으로 취급할지 파일 이름으로 처리할지는 키 끝에 슬래시(`/`) 문자를 사용하는지 여부에 따라 결정됩니다.

마지막 문자가 `/`인 경우 파일은 폴더에 복사되며 이름은 변경되지 않습니다. 최종 문자가 영숫자인 경우 업로드한 파일의 이름이 키 값으로 바뀝니다. 이 경우 해당 이름의 파일이 이미 있는 경우 **기존 항목 덮어쓰기** 필드의 설정에 따라 동작이 달라집니다.
+ **기존 파일 덮어쓰기**를 선택하면 기존 파일이 처리 중인 파일로 대체됩니다.
+ **기존 항목 덮어쓰기**를 선택하지 않은 경우 아무 일도 일어나지 않고 워크플로 처리가 중지됩니다.
**작은 정보**  
동일한 파일 경로에서 동시 쓰기를 실행하면 파일을 덮어쓸 때 예상치 못한 동작이 발생할 수 있습니다.

예를 들어 키 값이 `test/`인 경우 업로드한 파일이 `test` 폴더에 복사됩니다. 키 값이 `test/today`인 경우(및 **기존 파일 덮어쓰기**가 선택된 경우) 업로드하는 모든 파일이 `test` 폴더에 `today`(으)로 이름이 지정된 파일에 복사되고 이후의 각 파일은 이전 파일을 덮어씁니다.

**참고**  
Amazon S3는 버킷과 객체를 지원하며 계층 구조가 없습니다. 하지만 객체 키 이름에 접두사와 구분 기호를 사용하여 계층 구조를 나타내고 폴더와 비슷한 방식으로 데이터를 구성할 수 있습니다.

### 파일 복사 단계에서 이름이 지정된 변수를 사용하세요.
<a name="named-variable-copy"></a>

파일 복사 단계에서 변수를 사용하여 파일을 사용자별 폴더에 동적으로 복사할 수 있습니다. 현재는 `${transfer:UserName}` 또는 `${transfer:UploadDate}`를 변수로 사용하여 파일을 업로드하는 특정 사용자의 대상 위치 또는 현재 날짜를 기준으로 파일을 복사할 수 있습니다.

다음 예에서는 사용자가 파일을 `richard-roe` 업로드하면 파일이 `amzn-s3-demo-destination-bucket/richard-roe/processed/` 폴더에 복사됩니다. 사용자가`mary-major` 파일을 업로드하면 파일이 `amzn-s3-demo-destination-bucket/mary-major/processed/` 폴더에 복사됩니다.

![\[를 사용하여 파라미터화된 버킷과 키를 보여주는 복사 단계의 파라미터 화면입니다UserName.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-copy-dynamic.png)


마찬가지로 `${transfer:UploadDate}`를 변수로 사용하여 현재 날짜의 이름이 지정된 대상 위치에 파일을 복사할 수 있습니다. 다음 예에서 2022년 2월 1일에 대상을 `${transfer:UploadDate}/processed`으로 설정하면 업로드된 파일이 `amzn-s3-demo-destination-bucket/2022-02-01/processed/` 폴더에 복사됩니다.

![\[를 사용하여 파라미터화된 버킷과 키를 보여주는 복사 단계의 파라미터 화면입니다UploadDate.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-copy-dynamic-date.png)


이 두 변수를 함께 사용하여 기능을 조합하여 사용할 수도 있습니다. 예를 들어 **대상 키 접두사를** 로 설정하면와 같은 중첩 폴더가 **folder/\$1\$1transfer:UserName\$1/\$1\$1transfer:UploadDate\$1/**생성됩니다`folder/marymajor/2023-01-05/`.

### 복사 단계 IAM 권한
<a name="copy-step-iam"></a>

복사 단계를 성공적으로 수행하려면 워크플로의 실행 역할에 다음 권한이 포함되어 있어야 합니다.

```
{
    "Sid": "ListBucket",
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": [
        "arn:aws:s3:::amzn-s3-demo-destination-bucket"
    ]
}, {
    "Sid": "HomeDirObjectAccess",
    "Effect": "Allow",
    "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
    ],
    "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}
```

**참고**  
이 `s3:ListBucket` 권한은 **기존 항목 덮어쓰기**를 선택하지 않은 경우에만 필요합니다. 이 권한은 버킷을 검사하여 같은 이름의 파일이 이미 존재하는지 확인합니다. **기존 파일 덮어쓰기**를 선택한 경우 워크플로에서 파일을 확인할 필요 없이 그냥 쓰기만 하면 됩니다.  
Amazon S3 파일에 태그가 있는 경우 IAM 정책에 하나 또는 두 개의 권한을 추가해야 합니다.  
버전이 지정되지 않은 Amazon S3 파일에 `s3:GetObjectTagging`을 추가합니다.
버전이 지정된 Amazon S3 파일에 `s3:GetObjectVersionTagging`을 추가합니다.

## 파일 복호화
<a name="decrypt-step-details"></a>

 AWS 스토리지 블로그에는 Transfer Family 관리형 워크플로, [PGP 및를 사용한 암호화 및 암호화 해제를 사용하여 코드를 작성하지 않고 파일을 간단하게 해독하는 방법을 설명하는 게시물이 있습니다 AWS Transfer Family](https://aws.amazon.com/blogs/storage/encrypt-and-decrypt-files-with-pgp-and-aws-transfer-family/).

### 지원되는 대칭 암호화 알고리즘
<a name="symmetric-algorithms"></a>

PGP 복호화의 경우 Transfer Family는 PGP 파일 내에서 실제 파일 데이터를 암호화하는 데 사용되는 대칭 암호화 알고리즘을 지원합니다.
+ 지원되는 대칭 암호화 알고리즘에 대한 자세한 내용은 섹션을 참조하세요[PGP 대칭 암호화 알고리즘](key-management.md#pgp-symmetric-algorithms).
+ 이러한 대칭 알고리즘과 함께 사용되는 PGP 키 페어 알고리즘에 대한 자세한 내용은 섹션을 참조하세요[PGP 키 페어 알고리즘](key-management.md#pgp-key-algorithms).

### 워크플로에서 PGP 복호화 사용
<a name="configure-decryption"></a>

Transfer Family는 Pretty Good Privacy(PGP) 복호화를 기본적으로 지원합니다. SFTP, FTPS 또는 FTP를 통해 Amazon Simple Storage Service(S3) 또는 Amazon Elastic File System(Amazon EFS)에 업로드된 파일에서 PGP 복호화를 사용할 수 있습니다.

PGP 복호화를 사용하려면 파일 복호화에 사용할 PGP 프라이빗 키를 생성하고 저장해야 합니다. 그러면 사용자가 Transfer Family 서버에 파일을 업로드하기 전에 해당 PGP 암호화 키를 사용하여 파일을 암호화할 수 있습니다. 암호화된 파일을 받은 후 워크플로에서 해당 파일을 복호화할 수 있습니다. 자세한 자습서는 [파일 복호화를 위한 관리형 워크플로 설정](workflow-decrypt-tutorial.md)를 참조하세요.

지원되는 PGP 알고리즘 및 권장 사항에 대한 자세한 내용은 섹션을 참조하세요[PGP 암호화 및 복호화 알고리즘](key-management.md#pgp-encryption-algorithms).

**워크플로에서 PGP 복호화 사용**

1. 워크플로를 호스팅할 Transfer Family 서버를 식별하거나 새 서버를 생성합니다. PGP 키를 AWS Secrets Manager 에 올바른 암호 이름으로 저장하려면 먼저 서버 ID가 있어야 합니다.

1. PGP 키를 필요한 보안 암호 이름으로 AWS Secrets Manager 에 저장합니다. 자세한 내용은 [PGP 키 관리](manage-pgp-keys.md)을 참조하세요. 워크플로는 Secrets Manager의 암호 이름을 기반으로 복호화에 사용할 올바른 PGP 키를 자동으로 찾을 수 있습니다.
**참고**  
Secrets Manager에 암호를 저장하면 AWS 계정 에 요금이 발생합니다. 요금에 대한 자세한 내용은 [AWS Secrets Manager 요금](https://aws.amazon.com/secrets-manager/pricing)을 참조하세요.

1. PGP 키 쌍을 사용하여 파일을 암호화합니다. (지원되는 클라이언트 목록은 [지원되는 PGP 클라이언트](pgp-key-clients.md)를 참조하세요.) 명령줄을 사용하는 경우 다음 명령을 실행하세요. 이 명령을 사용하려면 `username@example.com`을 PGP 키 쌍을 만들 때 사용한 이메일 주소로 바꾸세요. `testfile.txt`를 암호화할 파일의 이름으로 바꿉니다.

   ```
   gpg -e -r username@example.com testfile.txt
   ```
**중요**  
 AWS Transfer Family 워크플로에 사용할 파일을 암호화할 때는 항상 `-r` 파라미터를 사용하여 비익명 수신자를 지정해야 합니다. 익명 암호화(수신자를 지정하지 않음)는 시스템이 복호화에 사용할 키를 식별할 수 없기 때문에 워크플로에서 복호화 실패를 일으킬 수 있습니다. 이 문제에 대한 디버깅 정보는에서 확인할 수 있습니다[익명 수신자 암호화 문제 해결](workflow-issues.md#workflows-decrypt-anonymous).

1. 암호화된 파일을 Transfer Family 서버에 업로드합니다.

1. 워크플로에서 복호화 단계를 구성합니다. 자세한 내용은 [복호화 단계 추가](#decrypt-step-procedure)를 참조하세요.

### 복호화 단계 추가
<a name="decrypt-step-procedure"></a>

복호화 단계는 워크플로의 일부로 Amazon S3 또는 Amazon EFS에 업로드된 암호화된 파일을 복호화합니다. 복호화 구성에 대한 자세한 내용은 [워크플로에서 PGP 복호화 사용](#configure-decryption)을 참조하세요.

워크플로의 복호화 단계를 생성할 때는 복호화한 파일의 대상을 지정해야 합니다. 대상 위치에 파일이 이미 있는 경우 기존 파일을 덮어쓸지 여부도 선택해야 합니다. Amazon CloudWatch Logs를 사용하여 실시간으로 복호화 워크플로 결과를 모니터링하고 각 파일에 대한 감사 로그를 가져올 수 있습니다.

해당 단계에서 **파일 복호화** 타입을 선택하면 **파라미터 구성** 페이지가 나타납니다. **PGP 복호화 파라미터 구성 섹션**의 값을 입력합니다.

사용 가능한 옵션은 다음과 같습니다.
+ **단계 이름** - 단계를 설명하는 이름을 입력합니다.
+ **파일 위치** - 파일 위치를 지정하여 이전 단계에서 사용한 파일 또는 업로드된 원본 파일을 복호화할 수 있습니다.
**참고**  
이 단계가 워크플로의 첫 번째 단계인 경우에는 이 파라미터를 사용할 수 없습니다.
+ **복호화된 파일의 대상** — Amazon S3 버킷 또는 Amazon EFS 파일 시스템을 복호화된 파일의 대상으로 선택합니다.
  + Amazon S3를 선택하는 경우 대상 버킷 이름과 대상 키 접두사를 제공해야 합니다. 사용자 이름을 기준으로 대상 키 접두사를 파라미터화하려면 **대상 키 접두사**에 **\$1\$1transfer:UserName\$1**을 입력합니다. 마찬가지로 업로드 날짜별로 대상 키 접두사를 파라미터화하려면 **대상 키 접두사**에 **\$1\$1Transfer:UploadDate\$1**를 입력합니다.
  + Amazon EFS를 선택하는 경우 대상 파일 시스템과 경로를 제공해야 합니다.
**참고**  
여기서 선택하는 스토리지 옵션은 이 워크플로가 연결된 Transfer Family 서버에서 사용하는 스토리지 시스템과 일치해야 합니다. 그렇지 않으면 이 워크플로를 실행하려고 시도하는 동안 오류가 발생합니다.
+ **기존 파일 덮어쓰기** - 파일을 업로드했는데 같은 파일 이름을 가진 파일이 대상에 이미 있는 경우 동작은 이 파라미터의 설정에 따라 달라집니다.
  + **기존 파일 덮어쓰기**를 선택하면 기존 파일이 처리 중인 파일로 대체됩니다.
  + **기존 항목 덮어쓰기**를 선택하지 않은 경우 아무 일도 일어나지 않고 워크플로 처리가 중지됩니다.
**작은 정보**  
동일한 파일 경로에서 동시 쓰기를 실행하면 파일을 덮어쓸 때 예상치 못한 동작이 발생할 수 있습니다.

다음 스크린샷은 파일 복호화 단계에서 선택할 수 있는 옵션의 예를 보여줍니다.

![\[샘플 값이 포함된 PGP 복호화 파라미터 구성 섹션을 보여주는 AWS Transfer Family 콘솔입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-decrypt-details.png)


### 복호화 단계를 위한 IAM 권한
<a name="decrypt-step-iam"></a>

복호화 단계를 성공적으로 수행하려면 워크플로의 실행 역할에 다음 권한이 포함되어 있어야 합니다.

```
{
    "Sid": "ListBucket",
    "Effect": "Allow",
    "Action": "s3:ListBucket",
    "Resource": [
        "arn:aws:s3:::amzn-s3-demo-destination-bucket"
    ]
}, {
    "Sid": "HomeDirObjectAccess",
    "Effect": "Allow",
    "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion"
    ],
    "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}, {
    "Sid": "Decrypt",
    "Effect": "Allow",
    "Action": [
        "secretsmanager:GetSecretValue",
    ],
    "Resource": "arn:aws:secretsmanager:region:account-id:secret:aws/transfer/*"
}
```

**참고**  
이 `s3:ListBucket` 권한은 **기존 항목 덮어쓰기**를 선택하지 않은 경우에만 필요합니다. 이 권한은 버킷을 검사하여 같은 이름의 파일이 이미 존재하는지 확인합니다. **기존 파일 덮어쓰기**를 선택한 경우 워크플로에서 파일을 확인할 필요 없이 그냥 쓰기만 하면 됩니다.  
Amazon S3 파일에 태그가 있는 경우 IAM 정책에 하나 또는 두 개의 권한을 추가해야 합니다.  
버전이 지정되지 않은 Amazon S3 파일에 `s3:GetObjectTagging`을 추가합니다.
버전이 지정된 Amazon S3 파일에 `s3:GetObjectVersionTagging`을 추가합니다.

## 파일 태그 지정
<a name="tag-step-details"></a>

추가 다운스트림 처리를 위해 인입 파일에 태그를 지정하려면 태그 단계를 사용하세요. 인입 파일에 할당하려는 태그의 값을 입력합니다. 현재 태그 작업은 Transfer Family 서버 스토리지로 Amazon S3를 사용하는 경우에만 지원됩니다.

다음 태그 단계 예에서는 각각 `scan_outcome` 및 `clean`를 태그 키와 값으로 할당합니다.

![\[태그 지정 단계의 세부 정보를 보여주는 워크플로 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-tag.png)


태그 단계를 성공적으로 수행하려면 워크플로의 실행 역할에 다음 권한이 포함되어 있어야 합니다.

```
{
            "Sid": "Tag",
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*"
            ]
}
```

**참고**  
워크플로에 복사 또는 복호화 단계 전에 실행되는 태그 단계가 포함되어 있는 경우 IAM 정책에 하나 또는 두 개의 권한을 추가해야 합니다.  
버전이 지정되지 않은 Amazon S3 파일에 `s3:GetObjectTagging`을 추가합니다.
버전이 지정된 Amazon S3 파일에 `s3:GetObjectVersionTagging`을 추가합니다.

## 파일 삭제
<a name="delete-step-details"></a>

이전 워크플로 단계에서 처리된 파일을 삭제하거나 원래 업로드된 파일을 삭제하려면 파일 삭제 단계를 사용하세요.

![\[삭제 단계의 세부 정보를 보여주는 워크플로 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-delete.png)


삭제 단계를 성공적으로 수행하려면 워크플로의 실행 역할에 다음 권한이 포함되어 있어야 합니다.

```
{
            "Sid": "Delete",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObjectVersion",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:secretsmanager:region:account-ID:secret:aws/transfer/*"
        }
```

## 워크플로에 명명된 변수
<a name="workflow-named-variables"></a>

복사 및 복호화 단계의 경우 변수를 사용하여 작업을 동적으로 수행할 수 있습니다. 현재는 다음과 같은 명명된 변수를 AWS Transfer Family 지원합니다.
+ 업로드하는 사용자를 기준으로 `${transfer:UserName}`을 사용하여 대상으로 파일을 복사하거나 암호를 해독합니다.
+ 현재 날짜를 기준으로 `${transfer:UploadDate}`를 사용하여 대상으로 파일을 복사하거나 암호를 해독합니다.

## 태그 및 삭제 워크플로 예시
<a name="sourcefile-workflow"></a>

다음 예는 데이터 분석 플랫폼과 같은 다운스트림 애플리케이션에서 처리해야 하는 수신 파일에 태그를 지정하는 워크플로를 보여줍니다. 인입 파일에 태그를 지정한 후 워크플로는 원래 업로드된 파일을 삭제하여 스토리지 비용을 절약합니다.

------
#### [ Console ]

**태그 및 이동 워크플로 예**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) AWS Transfer Family 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **워크플로**를 선택합니다.

1. **워크플로** 페이지에서 **워크플로 생성**을 선택합니다.

1. **워크플로 생성** 페이지에서 설명을 입력합니다. 이 설명은 **워크플로** 페이지에 표시됩니다.

1. 첫 번째 단계(복사)를 추가합니다.

   1. **공칭 단계** 섹션에서 **단계 추가**를 선택합니다.

   1. **파일 복사**를 선택한 후 **다음**을 선택합니다.

   1. 단계 이름을 입력한 다음 대상 버킷과 키 접두사를 선택합니다.  
![\[복사 단계의 세부 정보와 대상 버킷 및 키 접두사를 보여주는 워크플로 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-copy-first-step.png)

   1. **다음**을 선택한 다음 해당 단계에 대한 세부 정보를 검토합니다.

   1. **단계 생성**을 선택하여 단계를 추가하고 계속합니다.

1. 두 번째 단계(태그)를 추가합니다.

   1. **공칭 단계** 섹션에서 **단계 추가**를 선택합니다.

   1. **파일 태그 지정**을 선택한 후 **다음**을 선택합니다.

   1. 단계 이름을 입력합니다.

   1. **파일 위치**의 경우 **이전 단계에서 만든 파일에 태그 지정**을 선택합니다.

   1. **키**와 **값**을 입력합니다.  
![\[태그 지정 워크플로 단계의 구성 화면. 이전 단계에서 생성한 파일에 태그 지정 라디오 버튼이 선택되어 있습니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-tag.png)

   1. **다음**을 선택한 다음 해당 단계에 대한 세부 정보를 검토합니다.

   1. **단계 생성**을 선택하여 단계를 추가하고 계속합니다.

1. 세 번째 단계 추가(삭제).

   1. **공칭 단계** 섹션에서 **단계 추가**를 선택합니다.

   1. **파일 삭제**를 선택하고 **다음**을 선택합니다.  
![\[원본 소스 파일 삭제 라디오 버튼이 선택된 삭제 워크플로 단계의 구성 화면입니다.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-delete.png)

   1. 단계 이름을 입력합니다.

   1. **파일 위치**에서 **원본 소스 파일 삭제**를 선택합니다.

   1. **다음**을 선택한 다음 해당 단계에 대한 세부 정보를 검토합니다.

   1. **단계 생성**을 선택하여 단계를 추가하고 계속합니다.

1. 워크플로 구성을 검토한 다음 **워크플로 생성**을 선택합니다.

------
#### [ CLI ]

**태그 및 이동 워크플로 예**

1. 다음 코드를 파일에 저장합니다. 예: `tagAndMoveWorkflow.json`. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.

   ```
   [
      {
          "Type": "COPY",
          "CopyStepDetails": {
             "Name": "CopyStep",
             "DestinationFileLocation": {
                "S3FileLocation": {
                   "Bucket": "amzn-s3-demo-bucket",
                   "Key": "test/"
                }
             }
          }
      },
      {
          "Type": "TAG",
          "TagStepDetails": {
             "Name": "TagStep",
             "Tags": [
                {
                   "Key": "name",
                   "Value": "demo"
                }
             ],
             "SourceFileLocation": "${previous.file}"
          }
      },
      {
         "Type": "DELETE",
         "DeleteStepDetails":{
            "Name":"DeleteStep",
            "SourceFileLocation": "${original.file}"
         }
     }
   ]
   ```

   첫 번째 단계에서는 업로드된 파일을 새 Amazon S3 위치에 복사합니다. 두 번째 단계에서는 새 위치에 복사된 파일(`previous.file`)에 태그(키-값 쌍)를 추가합니다. 마지막으로 세 번째 단계에서는 원본 파일(`original.file`)을 삭제합니다.

1. 저장된 파일에서 워크플로를 생성합니다. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.

   ```
   aws transfer create-workflow --description "short-description" --steps file://path-to-file --region region-ID
   ```

   예제: 

   ```
   aws transfer create-workflow --description "copy-tag-delete workflow" --steps file://tagAndMoveWorkflow.json --region us-east-1
   ```
**참고**  
파일을 사용하여 파라미터를 로드하는 방법에 대한 자세한 내용은 [파일에서 파라미터를 로드하는 방법](https://docs.aws.amazon.com//cli/latest/userguide/cli-usage-parameters-file.html)을 참조하세요.

1. 기존 서버를 업데이트합니다.
**참고**  
이 단계에서는 이미 Transfer Family 서버가 있고 이 서버에 워크플로를 연결하려는 것으로 가정합니다. 그렇지 않은 경우 [SFTP, FTPS 또는 FTP 서버 엔드포인트 구성](tf-server-endpoint.md)를 참조하세요. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.

   ```
   aws transfer update-server --server-id server-ID --region region-ID 
     --workflow-details '{"OnUpload":[{ "WorkflowId": "workflow-ID","ExecutionRole": "execution-role-ARN"}]}'
   ```

   예제:

   ```
   aws transfer update-server --server-id s-1234567890abcdef0 --region us-east-2 
     --workflow-details '{"OnUpload":[{ "WorkflowId": "w-abcdef01234567890","ExecutionRole": "arn:aws:iam::111111111111:role/nikki-wolf-execution-role"}]}'
   ```

------

# 사용자 지정 파일 처리 단계 사용
<a name="custom-step-details"></a>

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

![\[이전 단계에서 생성한 파일에 사용자 지정 처리 적용 라디오 버튼이 선택된 사용자 지정 단계 화면과 대상 필드에 표시된 Lambda 함수.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-step-custom.png)


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

사용자 지정 워크플로 단계를 사용하면 [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html) API 작업을 직접적으로 호출하도록 Lambda 함수를 구성해야 합니다. `SendWorkflowStepState`는 단계가 성공 또는 실패 상태로 완료되었음을 워크플로 실행에 알립니다. `SendWorkflowStepState` API 작업의 상태는 Lambda 함수의 결과에 따라 선형 시퀀스의 예외 처리 단계 또는 공칭 단계를 간접적으로 호출합니다.

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

`SendWorkflowStepState` API 작업을 직접적으로 호출할 때는 다음 파라미터를 전송해야 합니다.

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

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

Lambda 함수에서 `SendWorkflowStepState` API 작업을 호출하려면 [관리형 워크플로가 도입](doc-history.md#workflows-introduced)된 후 게시된 AWS SDK 버전을 사용해야 합니다.

## 여러 Lambda 함수를 연속적으로 사용
<a name="multiple-lambdas"></a>

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

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

## 사용자 정의 처리 후 파일에 액세스
<a name="process-uploaded-file"></a>

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"
    },
```

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

**참고**  
Amazon EFS는 개체 태그를 사용하여 파일을 식별하지 않기 때문에 Amazon EFS를 사용하는 경우에는 이 동작이 발생하지 않습니다.

## 파일 업로드 AWS Lambda 시 로 전송된 이벤트 예
<a name="example-workflow-lambdas"></a>

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

------
#### [ 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": "amzn-s3-demo-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 함수 예
<a name="example-workflow-lambda"></a>

다음 Lambda 함수는 실행 상태와 관련된 정보를 추출한 다음 [SendWorkflowStepState](https://docs.aws.amazon.com/transfer/latest/APIReference/API_SendWorkflowStepState.html) API 작업을 직접적으로 호출하여 해당 단계의 워크플로에 상태 `SUCCESS` 또는 `FAILURE`를 반환합니다. 함수가 `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 권한
<a name="custom-step-iam"></a>

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

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

# 워크플로에 대한 IAM 정책
<a name="workflow-execution-role"></a>

서버에 워크플로를 추가할 때는 실행 역할을 선택해야 합니다. 서버는 워크플로를 실행할 때 이 역할을 사용합니다. 역할에 적절한 권한이 없는 경우 워크플로를 실행할 AWS Transfer Family 수 없습니다.

이 섹션에서는 워크플로를 실행하는 데 사용할 수 있는 한 가지 AWS Identity and Access Management (IAM) 권한 세트에 대해 설명합니다. 다른 예는 이 주제 후반부에서 설명합니다.

**참고**  
Amazon S3 파일에 태그가 있는 경우 IAM 정책에 하나 또는 두 개의 권한을 추가해야 합니다.  
버전이 지정되지 않은 Amazon S3 파일에 `s3:GetObjectTagging`을 추가합니다.
버전이 지정된 Amazon S3 파일에 `s3:GetObjectVersionTagging`을 추가합니다.

**워크플로에 대한 실행 역할을 만들려면**

1. 새 IAM 역할을 생성하고 AWS 관리형 정책을 `AWSTransferFullAccess` 역할에 추가합니다. 새 IAM 역할을 생성하는 방법에 대한 자세한 내용은 [IAM 역할 및 정책 생성](requirements-roles.md)을 참조하세요.

1. 다음 권한이 있는 다른 정책을 생성하여 이를 역할에 연결합니다. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ConsoleAccess",
               "Effect": "Allow",
               "Action": "s3:GetBucketLocation",
               "Resource": "*"
           },
           {
               "Sid": "ListObjectsInBucket",
               "Effect": "Allow",
               "Action": "s3:ListBucket",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           },
           {
               "Sid": "AllObjectActions",
               "Effect": "Allow",
               "Action": "s3:*Object",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           },
           {
               "Sid": "GetObjectVersion",
               "Effect": "Allow",
               "Action": "s3:GetObjectVersion",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           },
           {
               "Sid": "Custom",
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": [
                   "arn:aws:lambda:us-east-1:123456789012:function:function-name"
               ]
           },
           {
               "Sid": "Tag",
               "Effect": "Allow",
               "Action": [
                   "s3:PutObjectTagging",
                   "s3:PutObjectVersionTagging"
               ],
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket/*"
               ]
           }
       ]
   }
   ```

1. 이 역할을 저장하고 서버에 워크플로를 추가할 때 실행 역할로 지정하세요.
**참고**  
IAM 역할을 구성할 때는 워크플로에 대해 가능한 한 리소스에 대한 액세스를 제한할 것을 AWS 권장합니다.

## 워크플로 신뢰 관계
<a name="workflows-trust"></a>

워크플로 실행 역할에는 `transfer.amazonaws.com`과의 신뢰 관계도 필요합니다. AWS Transfer Family에 대한 신뢰 관계를 설정하려면 [신뢰 관계를 구축하기 위해](requirements-roles.md#establish-trust-transfer)을 참조하세요.

신뢰 관계를 구축하는 동시에 *혼란스러운 대리인* 문제를 피하도록 조치를 취할 수도 있습니다. 이 문제에 대한 설명과 이를 방지하는 방법의 예는 [교차 서비스 혼동된 대리자 방지](confused-deputy.md)을 참조하세요.

## 실행 역할 예시: 복호화, 복사, 태그 지정
<a name="example-workflow-role-copy-tag"></a>

태그 지정, 복사 및 복호화 단계가 포함된 워크플로가 있는 경우 다음 IAM 정책을 사용할 수 있습니다. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CopyRead",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
        },
        {
            "Sid": "CopyWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Sid": "CopyList",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-source-bucket",
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Sid": "Tag",
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:RequestObjectTag/Archive": "yes"
                }
            }
        },
        {
            "Sid": "ListBucket",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
        },
        {
            "Sid": "Decrypt",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:aws/transfer/*"
        }
    ]
}
```

## 실행 역할 예시: 함수 실행 및 삭제
<a name="example-workflow-role-custom-delete"></a>

이 예제에는 AWS Lambda 함수를 호출하는 워크플로가 있습니다. 워크플로에서 업로드된 파일을 삭제하고 이전 단계에서 실패한 워크플로 실행에 대해 조치를 취하는 예외 처리 단계가 있는 경우 다음 IAM 정책을 사용합니다. 각 `user input placeholder`를 사용자의 정보로 바꿉니다.

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Delete",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:DeleteObjectVersion"
            ],
            "Resource": "arn:aws:s3:::bucket-name"
        },
        {
            "Sid": "Custom",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:us-east-1:123456789012:function:function-name"
            ]
        }
    ]
}
```

## 워크플로의 예외 처리
<a name="exception-workflow"></a>

워크플로 실행 중에 오류가 발생하는 경우 지정한 예외 처리 단계가 실행됩니다. 워크플로의 공칭 단계를 지정하는 것과 같은 방식으로 워크플로의 오류 처리 단계를 지정합니다. 예를 들어 들어오는 파일의 유효성을 검사하기 위해 공칭의 단계로 사용자 지정 처리를 구성했다고 가정해 보겠습니다. 파일 검증이 실패하는 경우 예외 처리 단계를 통해 관리자에게 이메일을 보낼 수 있습니다.

다음 예 워크플로에는 두 단계가 포함되어 있습니다.
+ 업로드된 파일이 CSV 형식인지 여부를 확인하는 공칭 단계 1개
+ 업로드된 파일이 CSV 형식이 아니고, 공칭 단계가 실패하는 경우 이메일을 보내는 예외 처리 단계 1개

예외 처리 단계를 시작하려면 공칭 단계의 AWS Lambda 함수가 로 응답해야 합니다`Status="FAILURE"`. 워크플로에서 오류를 처리하는 방법에 대한 자세한 내용은 [사용자 지정 파일 처리 단계 사용](custom-step-details.md)를 참조하세요.

![\[\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflow-exception-sample.png)


# 워크플로 실행 모니터링
<a name="cloudwatch-workflow"></a>

Amazon CloudWatch는에서 실행하는 AWS 리소스와 애플리케이션을 AWS 클라우드 실시간으로 모니터링합니다. Amazon CloudWatch를 사용하여 워크플로에 대해 측정할 수 있는 변수인 지표를 수집하고 추적할 수 있습니다. Amazon CloudWatch를 사용하여 워크플로 지표와 통합 로그를 볼 수 있습니다.

## 워크플로를 위한 CloudWatch 로깅
<a name="cloudwatch-workflow-logs"></a>

CloudWatch는 워크플로 진행 상황 및 결과에 대한 통합 감사 및 로깅을 제공합니다.

**워크플로에 대한 Amazon CloudWatch Logs 보기**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 Amazon CloudWatch 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **로그**를 선택한 다음, **로그 그룹**을 선택합니다.

1. **로그 그룹** 페이지의 탐색 모음에서 AWS Transfer Family 서버에 적합한 리전을 선택합니다.

1. 서버에 해당하는 로그 그룹을 선택합니다.

   예를 들어 서버 ID가 `s-1234567890abcdef0`인 경우 로그 그룹은 `/aws/transfer/s-1234567890abcdef0`입니다.

1. 서버의 로그 그룹 세부 정보 페이지에는 가장 최근의 로그 스트림이 표시됩니다. 탐색 중인 사용자에 대한 로그 스트림은 두 가지입니다.
   + 각 Secure Shell(SSH) File Transfer 프로토콜(SFTP) 세션별 로그 스트림
   + 서버에서 실행 중인 워크플로의 로그 스트림 워크플로의 로그 스트림 형식은 `username.workflowID.uniqueStreamSuffix`입니다.

   예를 들어 사용자가 `mary-major`이면 다음과 같은 로그 스트림이 있습니다.

   ```
   mary-major-east.1234567890abcdef0
   mary.w-abcdef01234567890.021345abcdef6789
   ```
**참고**  
 이 예에 나열된 16자리 영숫자 식별자는 가상의 식별자입니다. Amazon CloudWatch에 표시되는 값은 다릅니다.

`mary-major-usa-east.1234567890abcdef0`의 **로그 이벤트** 페이지에는 각 사용자 세션의 세부 정보가 표시되고 `mary.w-abcdef01234567890.021345abcdef6789` 로그 스트림에는 워크플로에 대한 세부 정보가 포함됩니다.

 다음은 복사 단계가 포함된 워크플로(`w-abcdef01234567890`)를 기반으로 하는 `mary.w-abcdef01234567890.021345abcdef6789`의 샘플 로그 스트림입니다.

```
{
    "type": "ExecutionStarted",
    "details": {
        "input": {
            "initialFileLocation": {
                "bucket": "amzn-s3-demo-bucket",
                "key": "mary/workflowSteps2.json",
                "versionId": "version-id",
                "etag": "etag-id"
            }
        }
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails": {
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"StepStarted",
    "details": {
        "input": {
            "fileLocation": {
                "backingStore":"S3",
                "bucket":"amzn-s3-demo-bucket",
                "key":"mary/workflowSteps2.json",
                "versionId":"version-id",
                "etag":"etag-id"
            }
        },
        "stepType":"COPY",
        "stepName":"copyToShared"
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails": {
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"StepCompleted",
    "details":{
        "output":{},
        "stepType":"COPY",
        "stepName":"copyToShared"
    },
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails":{
        "serverId":"server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
},
{
    "type":"ExecutionCompleted",
    "details": {},
    "workflowId":"w-abcdef01234567890",
    "executionId":"execution-id",
    "transferDetails":{
        "serverId":"s-server-id",
        "username":"mary",
        "sessionId":"session-id"
    }
}
```

## 워크플로를 위한 CloudWatch 지표
<a name="cloudwatch-workflows-metrics"></a>

AWS Transfer Family 는 워크플로에 대한 여러 지표를 제공합니다. 이전 1분 간 시작, 성공적으로 완료, 및 실패한 워크플로 실행 수에 대한 지표를 볼 수 있습니다. Transfer Family에 대한 모든 CloudWatch 지표는 [Transfer Family 서버에 CloudWatch 지표 사용](metrics.md)에 설명되어 있습니다.

# 템플릿에서 워크플로 생성
<a name="workflow-template"></a>

템플릿에서 워크플로와 서버를 생성하는 CloudFormation 스택을 배포할 수 있습니다. 이 절차에는 워크플로를 빠르게 배포하는 데 사용할 수 있는 예가 포함되어 있습니다.

**AWS Transfer Family 워크플로 및 서버를 생성하는 CloudFormation 스택을 생성하려면**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. 다음 코드를 파일에 저장합니다.

------
#### [ YAML ]

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Resources:
     SFTPServer:
       Type: 'AWS::Transfer::Server'
       Properties:
         WorkflowDetails:
           OnUpload:
             - ExecutionRole: workflow-execution-role-arn
               WorkflowId: !GetAtt
                 - TransferWorkflow
                 - WorkflowId
     TransferWorkflow:
       Type: AWS::Transfer::Workflow
       Properties:
         Description: Transfer Family Workflows Blog
         Steps:
           - Type: COPY
             CopyStepDetails:
               Name: copyToUserKey
               DestinationFileLocation:
                 S3FileLocation:
                   Bucket: archived-records
                   Key: ${transfer:UserName}/
               OverwriteExisting: 'TRUE'
           - Type: TAG
             TagStepDetails:
               Name: tagFileForArchive
               Tags:
                 - Key: Archive
                   Value: yes
           - Type: CUSTOM
             CustomStepDetails:
               Name: transferExtract
               Target: arn:aws:lambda:region:account-id:function:function-name
               TimeoutSeconds: 60
           - Type: DELETE
             DeleteStepDetails:
               Name: DeleteInputFile
               SourceFileLocation: '${original.file}'
         Tags:
           - Key: Name
             Value: TransferFamilyWorkflows
   ```

------
#### [ JSON ]

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Resources": {
           "SFTPServer": {
               "Type": "AWS::Transfer::Server",
               "Properties": {
                   "WorkflowDetails": {
                       "OnUpload": [
                           {
                               "ExecutionRole": "workflow-execution-role-arn",
                               "WorkflowId": {
                                   "Fn::GetAtt": [
                                       "TransferWorkflow",
                                       "WorkflowId"
                                   ]
                               }
                           }
                       ]
                   }
               }
           },
           "TransferWorkflow": {
               "Type": "AWS::Transfer::Workflow",
               "Properties": {
                   "Description": "Transfer Family Workflows Blog",
                   "Steps": [
                       {
                           "Type": "COPY",
                           "CopyStepDetails": {
                               "Name": "copyToUserKey",
                               "DestinationFileLocation": {
                                   "S3FileLocation": {
                                       "Bucket": "archived-records",
                                       "Key": "${transfer:UserName}/"
                                   }
                               },
                               "OverwriteExisting": "TRUE"
                           }
                       },
                       {
                           "Type": "TAG",
                           "TagStepDetails": {
                               "Name": "tagFileForArchive",
                               "Tags": [
                                   {
                                       "Key": "Archive",
                                       "Value": "yes"
                                   }
                               ]
                           }
                       },
                       {
                           "Type": "CUSTOM",
                           "CustomStepDetails": {
                               "Name": "transferExtract",
                               "Target": "arn:aws:lambda:region:account-id:function:function-name",
                               "TimeoutSeconds": 60
                           }
                       },
                       {
                           "Type": "DELETE",
                           "DeleteStepDetails": {
                               "Name": "DeleteInputFile",
                               "SourceFileLocation": "${original.file}"
                           }
                       }
                   ],
                   "Tags": [
                       {
                           "Key": "Name",
                           "Value": "TransferFamilyWorkflows"
                       }
                   ]
               }
           }
       }
   }
   ```

------

1. 다음 항목을 실제 값으로 대체합니다.
   + *`workflow-execution-role-arn`*을 실제 워크플로 실행 역할의 ARN으로 바꿉니다. 예: `arn:aws:transfer:us-east-2:111122223333:workflow/w-1234567890abcdef0`
   + `arn:aws:lambda:region:account-id:function:function-name`을 Lambda 함수 ARN으로 바꿉니다. 예를 들어 `arn:aws:lambda:us-east-2:123456789012:function:example-lambda-idp`입니다.

1. *AWS CloudFormation 사용 설명서*의 CloudFormation 스택 템플릿 [선택에서 기존 템플릿의 스택](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-using-console-create-stack-template.html) 배포 지침을 따릅니다.

스택을 배포한 후에는 CloudFormation 콘솔의 **출력** 탭에서 스택에 대한 세부 정보를 볼 수 있습니다. 템플릿은 서비스 관리 사용자를 사용하는 새 AWS Transfer Family SFTP 서버와 새 워크플로를 생성하고 워크플로를 새 서버와 연결합니다.

## Transfer Family 서버에서 워크플로 제거
<a name="remove-workflow-association"></a>

워크플로를 Transfer Family 서버와 연결했는데 이제 해당 연결을 제거하려는 경우 콘솔을 사용하거나 프로그래밍 방식으로 제거할 수 있습니다.

------
#### [ Console ]

**Transfer Family 서버에서 워크플로 제거**

1. [https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/) AWS Transfer Family 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **서버**를 선택합니다.

1. **서버 ID** 열에서 서버 식별자를 선택합니다.

1. 서버의 세부 정보 페이지에서 **추가 세부 정보** 섹션까지 아래로 스크롤한 다음 **편집**을 선택합니다.

1. **추가 세부 정보 편집** 페이지의 **관리형 워크플로** 섹션에서 모든 설정에 대한 정보를 지웁니다.
   + **전체 파일 업로드를 위한 워크플로**의 워크플로 목록에서 대시(-)를 선택합니다.
   + 아직 지우지 않은 경우 **부분 파일 업로드 워크플로**의 워크플로 목록에서 대시(-)를 선택합니다.
   +  **관리형 워크플로 실행 역할**의 역할 목록에서 대시(-)를 선택합니다.

   대시가 보이지 않는 경우 각 메뉴의 첫 번째 값이므로 대시가 보일 때까지 위로 스크롤하세요.

   결과는 다음과 같아야 합니다.  
![\[모든 파라미터가 지워진 관리형 워크플로 창.\]](http://docs.aws.amazon.com/ko_kr/transfer/latest/userguide/images/workflows-remove-from-server.png)

1. 변경 내용을 저장하려면 아래로 스크롤하여 **저장**을 선택합니다.

------
#### [ CLI ]

`update-server`(또는 API용 `UpdateServer`) 직접 호출을 사용하고 `OnUpload` 및 `OnPartialUpload` 파라미터에 빈 인수를 제공합니다.

에서 다음 명령을 AWS CLI실행합니다.

```
aws transfer update-server --server-id your-server-id --workflow-details '{"OnPartialUpload":[],"OnUpload":[]}'
```

`your-server-id`를 서버의 ID로 바꿉니다. 예를 들어, 서버 ID가 `s-01234567890abcdef`인 경우 명령은 다음과 같습니다.

```
aws transfer update-server --server-id s-01234567890abcdef --workflow-details '{"OnPartialUpload":[],"OnUpload":[]}'
```

------

## 관리형 워크플로 제한 및 제약 조건
<a name="limitations-workflow"></a>

**제한 사항**

현재 다음과 같은 제한 사항이 AWS Transfer Family의 업로드 후 처리 워크플로에 적용됩니다.
+ 교차 계정 및 교차 리전 AWS Lambda 함수는 지원되지 않습니다. 그러나 AWS Identity and Access Management (IAM) 정책이 올바르게 구성된 경우 계정 간에 복사할 수 있습니다.
+ 모든 워크플로 단계에서 워크플로로 액세스하는 모든 Amazon S3 버킷은 워크플로와 동일한 리전에 있어야 합니다.
+ 복호화 단계의 경우 복호화 대상이 리전 및 지원 스토어의 원본과 일치해야 합니다(예를 들어, 해독할 파일이 Amazon S3에 저장되어 있는 경우 지정된 대상도 Amazon S3에 있어야 함).
+ 비동기 사용자 지정 단계만 지원됩니다.
+ 사용자 지정 단계 제한 시간은 근사값입니다. 즉, 지정된 제한 시간보다 약간 더 오래 걸릴 수 있습니다. 또한 워크플로는 Lambda 함수에 따라 달라집니다. 따라서 실행 중에 함수가 지연되는 경우 워크플로는 지연을 인식하지 못합니다.
+ 제한 한도를 초과하는 경우 Transfer Family는 대기열에 워크플로 작업을 추가하지 않습니다.
+ 크기가 0인 파일에 대해서는 워크플로가 시작되지 않습니다. 크기가 0보다 큰 파일은 관련 워크플로를 시작합니다.
+ AS2 프로토콜을 사용하는 Transfer Family 서버에 파일 처리 워크플로를 연결할 수 있습니다. 하지만 AS2 메시지는 서버에 연결된 워크플로를 실행하지 않습니다.

**제한 사항 **

 또한 Transfer Family의 워크플로에는 다음과 같은 기능 제한이 적용됩니다.
+ 리전별, 계정별 워크플로 수는 10개로 제한됩니다.
+ 사용자 지정 단계의 최대 제한 시간은 30분입니다.
+ 워크플로의 최대 단계 수는 8개입니다.
+ 워크플로당 최대 태그 수는 50개입니다.
+ 복호화 단계가 포함된 최대 동시 실행 수는 워크플로당 250개입니다.
+ 사용자당 Transfer Family 서버당 최대 3개의 PGP 프라이빗 키를 저장할 수 있습니다.
+ 복호화된 파일의 최대 크기는 10GB입니다.
+ 버스트 용량이 100이고 리필 비율이 1인 [토큰 버킷](https://en.wikipedia.org/wiki/Token_bucket) 시스템을 사용하여 새 실행률을 제한합니다.
+ 서버에서 워크플로를 제거하고 새 워크플로로 바꾸거나 워크플로의 실행 역할에 영향을 미치는 서버 구성을 업데이트할 때마다 새 워크플로를 실행하기 전에 약 10분을 기다려야 합니다. Transfer Family 서버는 워크플로 세부 정보를 캐시하며 서버가 캐시를 새로 고치는 데 10분이 걸립니다.

  또한 활성 SFTP 세션에서 로그아웃한 다음 10분 대기 시간이 지난 후 다시 로그인해야 변경 사항을 확인할 수 있습니다.