【アップデート】AWS Transfer Family SFTP コネクタ は、ファイル転送操作のステータスをリアルタイムで表示するようになりました

# はじめに
こんにちは。株式会社ジールの[@yakisobapan](https://qiita.com/yakisobapan)です。

AWS Transfer Familyにて、**ファイル転送操作のステータスをリアルタイムで確認**できるようになりましたので、試してみました！

# 目次
 - アップデート内容
 - やってみた
 - 所感

# アップデート内容
AWS Transfer Family は、SFTP コネクタを使用して開始されたファイル転送のステータスをリアルタイムで表示するようになりました。
この機能により、ファイル転送操作の現在の状態を簡単に監視し、転送後のアクションを調整して、AWS のマネージドファイル転送 (MFT) ワークフローを自動化できます。

SFTP コネクタは、リモート SFTP サーバーと Amazon S3 間でファイルを転送するためのフルマネージド型ローコード機能を提供します。これで、どのファイル転送が完了したか、進行中、キューに入っているか、失敗したかなど、ファイル転送操作のステータスをオンデマンドでクエリできるようになりました。

この機能を使用すると、ステータス通知の送信、正常に転送されたファイルのダウンストリーム処理の開始、障害発生時の再試行の開始など、ファイルステータスに基づいて転送後のアクションを調整できます。
たとえば、AWS Step Functions を使用してファイル転送ワークフローを調整する場合、SFTP コネクタを使用してリクエストされたファイル転送操作のステータスを再帰的にポーリングし、ファイル転送が完了すると自動的に後処理ステップを開始できるようになりました。
>AWS Transfer Family SFTP connectors now provide real-time status of file transfer operationsより引用
（2024/10/14 What's New with AWS?）

https://aws.amazon.com/about-aws/whats-new/2024/10/aws-transfer-family-sftp-connectors-status-file-transfer-operations/?nc1=h_ls

今回のアップデート機能を利用することでSFTPコネクタを利用したファイル転送時に、最新の転送ステータスを確認して、それに応じたアクションを行うことができるようになりました。

# やってみた

Step Functionsを利用して、
ListFileTransferResults* API コマンドのレスポンスに応じた対応を取る仕組みを作ってみました。

*特定のファイル転送操作で転送される各ファイルのステータスに関するリアルタイムの更新と詳細情報を返します。

<br>

**主な利用サービス**

- Transfer Family
　ファイル転送を行う役割として利用（SFTPコネクタ）
　※SFTPサーバーを立てることもできますが、今回はEC2インスタンスで代用しています。
- Step Functions
　一連のワークフローを組むために利用
- Lambda
　今回追加されたAPIコマンド（ListFileTransferResults）を実行
- SNS
　ファイル転送が完了したら通知するよう、Step Functionsタスクで利用
- S3
　オブジェクトストレージ（ファイル送信元）として利用
- EC2
　SFTPサーバ－（ファイル送信先）として利用
- Secrets Manager
　SFTPサーバーの接続情報（User,PrivateKey）を保管

ざっくり構成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/ecc3563a-f057-f7ed-2302-cfbd547ae20a.png)
※色々、簡略化しています。

 
**手順**
- （EC2）インスタンスの作成
　SFTPサーバー用途として、インスタンスを起動します。
- （Secrets Manager）シークレットの保存
　インスタンスへ接続する際に利用する接続情報を保存します。
 　後続の[SFTPコネクタの作成]にて利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/68f15480-cd79-6eb7-eb84-54502bde833d.png)

- （Transfer Family）SFTPコネクタの作成
　S3とSFTPサーバーをつなぐコネクタを作成します。
 
  　少し手こずった箇所を備忘として記載します。
　　①信頼できるホストキーの取得方法

```bash:bash
[ec2-user@ip-123-45-67-89 ~]$ ssh-keyscan -t rsa,ecdsa,ed25519 [プライベート IP DNS 名]
```
　　②インスタンスを停止した場合、再起動時にURLのIPアドレスが変わるので、再設定してあげる必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/90085b09-2292-00fb-2df7-19271a8f609f.png)


 - （Step Functions）ステートマシンの作成
 　ステートマシンを作成します。

 　簡単に以下のフローで組みました。
 　初めてStep Functionsを触ったので、適切ではない組み方があるかもしれません。
＜フロー＞
①（Transfer Family）StartFileTransfer APIを実行
②（Lambda）ListFileTransferResults APIを実行
　INPUTとして①のTransferIdを受け取る
③Choice
　INPUTとして②の転送ステータスを受け取る
　ステータスがCOMPLETEDならば、④-1へ分岐
　ステータスがCOMPLETED以外ならば、④-2へ分岐
④-1 （SNS）成功をメール通知し、終了
④-2 Wait 5秒待機し②へ遷移する
⑤（SNS）②を3回実行してもステータスがCOMPLETED以外 or その他の例外の場合、失敗をメール通知し、終了


  ![stepfunctions_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/034efbba-29b7-b314-9e94-87e71c451fb4.png)

```python:lambda_function.py
import boto3
#ListFileTransferResults APIを利用したいので、最新のboto3をzip化し、Lambdaレイヤーで載せました。

def lambda_handler(event, context):
    print('boto3 version is ',boto3.__version__)

    transfer_id = event['StartFileTransferResult']["TransferId"]

    client = boto3.client('transfer')
    response = client.list_file_transfer_results(
        ConnectorId = 'c-XXXXXX',
        TransferId = transfer_id
    )
    
    status = response["FileTransferResults"][0]["StatusCode"]
    print('StatusCode :',status)

    return status

```

**実行**
S3の指定フォルダに転送するファイルを配置しステートマシンを実行します。

想定通り、転送ステータスをチェックして、応じたアクションを行ってくれました！
今回だと、転送が完了し、成功メール送信がされていることを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/ecacc191-5b90-5207-55aa-230a64b01c5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/1540923f-ddf0-36d6-d189-b03ac1a20fad.png)


先述した＜フロー＞で表すと、①→②→③→④-2→②→④-1という流れを辿っています。
①    StartFileTransfer
②    Lambda Invoke
③    Choice
④-2  Wait
②    Lambda Invoke
④-1  SNS Publish_COMPLETED

![run_status_complate_wait6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737731/861d2e20-74f5-0eb2-1271-f8d1e3b83830.gif)

# 所感
 - まとめ、ユースケース
今回のアップデートによって、SFTPコネクタのファイル転送状態を(ほぼ)リアルタイムで確認し、ステータスに応じたアクションを行えるようになりました。

これにより、
　・長期化しているファイル転送の特定を(ほぼ)リアルタイムで行い、メール通知する
　・ファイル転送が成功(失敗)した場合、即時に後続のアクションを実施する
という実装がより簡単にできるようになったのではないかと考えます。

 - 勉強になったこと
・ 最新のAPIは、マニュアルで読込させる必要がある（boto3ならば、最新版をzip化してロードする必要がある）
　⇒別の新規追加されたAPIコマンドの検証において、利用できずに困っていたのですが、これにより解決できそうですので、試してみようと思いました。


# 参考

https://aws.amazon.com/jp/about-aws/whats-new/2024/10/aws-transfer-family-sftp-connectors-status-file-transfer-operations/?nc1=h_ls

https://docs.aws.amazon.com/ja_jp/transfer/latest/APIReference/API_ListFileTransferResults.html

***
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area