AWS Transfer Family の勘所

## はじめに

こんにちは、NTTテクノクロスでAWSの開発エンジニアをやらせていただいています。だはです。
元教員として、初心者目線から色々な記事を書かせていただいています。
今回は[NTTテクノクロスアドベントカレンダーシリーズ2](https://qiita.com/advent-calendar/2024/ntt-tx)の20日目となります。
業務的にはIaC (Infrastructure as Code)に近い技術を触ることが多いのですが、細かなサービスごとの差異に着目してみたり、便利な使い方をメモに残してみたりしようと思っています。
今回は第四弾として、「AWS Transfer Family の勘所」を書いてみようと思います。

## 目次

[1.概要](#1概要)
[2.ハマりどころや推せるポイント](#2ハマりどころや推せるポイント)
[　2-1.SFTPサーバーを簡単に作れる](#2-1SFTPサーバーを簡単に作れる)
[　2-2.SSHキーの取り扱い](#2-2SSHキーの取り扱い)
[　2-3.とても便利な機能](#2-3とても便利な機能)
[3.まとめ](#3まとめ)
[4.あとがき](#4あとがき)

## 1.概要

ここでお伝えしたいのは、大きく分けて3点です。

#### どんなサービスなのか
まず今回の主題であるサービスをご紹介します。
AWSには["Transfer Family"](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/what-is-aws-transfer-family.html)というサービスがあります。「ストレージとストレージの間でファイルを運んでくれるサービス」だと私は解釈しています。
興味のある方は[公式のリファレンス](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/what-is-aws-transfer-family.html)を閲覧することで、どんなことができるかは確認できるかと思います。

#### どんなことをしてきたのか
これからこのサービスを使いたい、というお客様向けに
* どんな事ができるのか
* (お客様の)想定通りに使えるのか
* 安全に使えるのか

という観点で様々調査しました。
その過程で「このサービス面白いなあ」と思ったので、記事にしようと思い立ちました。

#### どんな話をしたいのか
[「はじめに」](#はじめに)でもご紹介したように、今回は「AWS Transfer Family の勘所」を書いていきます。
目次で大まかな内容は想像がつくかと思いますが、実際にサービスを利用していくにあたって「ここは苦戦したから残しておきたいな」「こう使うと便利だな」と感じた部分を書きました。

[(目次へ)](#目次)

## 2.ハマりどころや推せるポイント

### 2-1.SFTPサーバーを簡単に作れる

まず大前提として「これ便利だよ！」と声を大にしたいのが、このサービスはお手軽にSFTPサーバーを作成することができます。

ここで、一部「SFTPって何？」という人も出てくるかと思います。
ざっくり書くと、「SSHを使ってセキュアにしたFTP」です。
FTPは元々ファイル共有プロトコルとして歴史があるものですが、そこにSSHの仕組みを利用してセキュリティを強化したものがSFTPです。
SSHキーによる認証を挟むため、設定に一手間一工夫入るのがミソです。後述しますが、私はこの点で躓きました。
ちなみにSSL/TLSを利用したFTPS、というものも存在します。ややこしい。

より詳しく知りたい方は、下記のページがわかりやすくて良いと思います。
[DevelopersIOブログ：イラストで理解するSFTP](https://dev.classmethod.jp/articles/what-sftp/)

話を戻しますが、上記の仕組みを数クリックで簡単に作れるのが本サービスの魅力なのです。当然AWSサービスなので、ユーザー認証認可はばっちりです。
図解として、[AWS公式の動画](https://www.youtube.com/watch?v=AQtTG2N_QCg)から引用させていただきます。
![transfer family①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/2bf8fb60-2ff0-1e28-cf76-f9bd01064193.png)

どれくらい簡単なのか、ちょっとやってみたいと思います。
<br>
①まずはサービスのコンソール画面から、「サーバーの作成」ボタンをクリックします。
![transfer family②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/0c7e14a0-80ed-e8bc-69c3-396462f5fcd1.png)
<br>
②次にプロトコルを選択します。
ここで気づくと思いますが、先述したFTPやFTPSも作成可能です。
ただしセキュリティには注意が必要です。
![transfer family③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/89909f6c-fe6d-6d68-bb50-a8ea379ce09c.png)
<br>
③次はIDプロバイダの選択です。

:::note info
「IDプロバイダ」とは、該当するサーバーにアクセスするユーザーを管理する仕組みを指しています。
ここで「サービスマネージド」を選択すると、Transfer Familyのサービス内でユーザーの管理が完結します。
他の2つは外部で管理することができる、というオプションです。
:::

要件で指定が無い、もしくは事前に用意したものが無ければ、そのまま次へ進んでもらって大丈夫なはずです。
![transfer family④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/8a6647a9-1149-0497-cbc7-f28a2d15c0e5.png)
<br>
④次はエンドポイントです。
本項ではSFTPサーバーの公開方法を指定します。
「パブリックアクセス可能」とした場合は、インターネットから直接アクセスできます。「VPCでホスト」を選択した場合は、セキュリティグループでアクセス元を制限することができます。どちらを選択するかは、要件に合わせて要検討かもしれないですね。
![transfer family⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/3669c08f-5ec6-cb58-920f-8d64f0373eab.png)
<br>
⑤ドメインも選択できます。

:::note info
今回のドメインは、SFTPサーバーを介してファイルを管理する対象のストレージを指します。
:::

S3対象にもEFS対象にも作れるのです。便利。
![transfer family⑥.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/2e7b9f86-3dc7-2ce2-88ef-2ddbe1ab1b8e.png)
<br>
⑥次は諸々オプションの選択です。
後で追加変更できる部分もあるので、一旦次へ進みます。
![transfer family⑦.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/9fc4af45-d5d9-2f2a-95c6-e673dac2e71e.png)
<br>
⑦最後に確認したら、完了です。
![transfer family⑧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/b0684d3e-0734-8741-7ee5-754fc585c236.png)
<br>
⑧こうして、マウスクリックだけでできてしまうのです。
キーボード使っていません。簡単すぎる。
![transfer family⑨.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/51b9addf-c875-853a-d1ff-0ba5c31f4e2f.png)

この後利用するにあたってユーザーの登録やSSHキーの設定など諸々ありますが、とにかく作成だけならクリックだけで完了します。便利。

Transfer Familyについてより詳しく知りたい方は、是非こちらもご覧ください。
[slideshare：AWS Transfer Family SFTP and FTPS](https://www.slideshare.net/KamedaHarunobu/aws-transfer-family-sftp-and-ftps)

### 2-2.各種キーの取り扱い

ここからは少し踏み込んで、サービスを使い始めた人向けの内容になるかと思います。
まず私が躓いたのは、キーの設定です。
Transfer Familyでは二種類のキー認証があります。
* SSHキー
⇒ユーザー認証
* PGPキー
⇒格納ファイルの複合

の、二種類です。SSHキーに関しては私も僅かながら経験があったのですが、PGPキーについては初耳だったのでかなり勉強させてもらいました。
一番困ったところだけ取り上げると、PGPキーには短縮版と完全版の二種類あることです。
私は当初「PGPキーが必要なんだな！なるほど！」ということで、"PGP"や"GPG(PGPキーを生成するソフト)"でググってコマンドを調べていました。
そうすると、大体は` gpg --gen-key `というコマンドが出てくるのです。
しかしこれではダメだったようで、何度もエラーが起きて進めずにいました。

日を跨いで[AWSのユーザーガイド](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/key-management.html)をよく見ると「短縮版が使えるのは古いやつだけだよ」と記載があったのです。
![transfer family⑩.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/5b808d51-48f3-38c6-7dd6-ebaeded9c76a.png)
なんと**GPGのキー生成には短縮版と完全版の二種類あった**というオチでした。

:::note info
必要な部分だけざっくり取り上げると、
* PGP キーのアルゴリズムとして、RSA、Elgamal、ECC（NIST、BrainPool）が利用可能
* GnuPG のバージョン 2.3.0 以降で ` --gen-key `オプションのデフォルトアルゴリズムである ECC（Curve25519）はサポートされていない
* ` --full-gen-key `オプションを使って、サポートされているアルゴリズムを指定する必要がある
* GnuPGのバージョンが2.3.0より前であれば、RSAがデフォルトの暗号化であるため、` gpg --gen-key `でも利用可能
:::

先に進むまで何時間もかかりましたが、` gpg --full-gen-key `でやり直すことで、あっさり解消しました。
これで学んだのは、**ユーザーガイドちゃんと読むのが大事**ということですね。当たり前だ。

より詳しく知りたい方は、下記をご参照ください。
[「AWS Transfer Family ユーザーガイド：キーの管理」](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/key-management.html)

::: note warn
また当然ですが、**キーはそれぞれ一回生成すると二度と表示されない**ので、どちらのキーもしっかり管理しておくことを推奨します。人間では覚えきれないやつです。パソコン様々ですね。
:::

### 2-3.とても便利な機能

この記事でお伝えしたいことの3点目は、便利機能のご紹介です。
[AWS Transfer Family マネージドワークフロー](https://docs.aws.amazon.com/ja_jp/transfer/latest/userguide/transfer-workflows.html)というものがありまして、一言で表すと「ファイルの設置に反応して色々処理してくれる」という機能です。
![transfer family⑪.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773852/4cf39de7-1788-39b3-a252-f53360ca808d.png)
できることは(見た目だけだと)全部で5種類あります。それぞれ
* ファイルコピー
* ファイルにタグ付け
* ファイル削除
* Lambda呼び出し
* 自動的に復号(2-2で取り上げたPGPキーを利用)

の、5つです。
これらを組み合わせることもできるので、
①ファイルの設置に反応して、別のフォルダにファイルコピー
②コピー元のファイルを削除
と組み合わせれば、自動的にファイル移動の仕組みを作ることも可能です。
更にLambdaを呼び出せば、おおよそやりたいことは実現できるんじゃないでしょうか。
ただし、いくつか制限があるので注意は必要です。

:::note warn
ファイルコピーはリソースを跨げません。
ex.)S3⇒S3のコピーは可能、S3⇒EFSのコピーは不可能
:::

:::note warn
Lambdaと連携するには、別途IAM権限の整備が必要です。
:::

ただAWSを使い慣れている人ならば一般的とも言える範囲の制約なので、あまり違和感は感じませんでした。

あと私はあまり深く触れていないので取り上げませんが、アカウントを跨ぐ機能もあるようです。ほんとに何でもできますね。

## 3.まとめ

#### 3-1.お手軽にファイル共有サーバーを作成
  とにかく今回大きく取り上げたいのは、**「簡単にSFTPサーバーを作れるよ！」** という点に尽きるかと思います。クリックだけでサーバーの作成まではいけます。ユーザー作成もそこまで難しくなく、SSHキーの作成さえ自前でなんとかすればササッとファイル共有サーバーを作れてしまえるのです。
  社内や身内向けにプライベートなサーバーを作るのであれば、FTPやFTPSの選択肢も上がるかと思います。特に思い当たる利用シーンとしては、ファイルを共有したいけども
  * AWSアカウントは共有したくない
  * S3バケットを公開したくない
  * EFS環境を整える手間をかけたくない

  なんて時には、「AWS Transfer Family」の利用を検討しても良いのではないでしょうか。

#### 3-2.アレンジしがいのあるワークフロー
  もう一つお伝えしたいのは、ワークフローという機能です。お好きなステップを組み合わせることで、ファイルの設置に反応して色々なことができてしまいます。
  多くの方は、S3バケットにオブジェクト設置⇒EventBridgeで反応⇒他のサービスで処理、なんてアーキテクチャをざっくり作ったことがあるかと思いますが、Transfer Familyはそれが1つのサービス内で完結するのが魅力だと感じました。
  無限、とまではいきませんが可能性に溢れた機能だと思います。是非触ってみてください。

## 4.あとがき

今回はTransfer Familyの使い易さ使い辛さを残していくことで、技術的なノウハウを残す記事を書いてみました。これからTransfer Familyを触る方の一助になれば幸いです。
正直なところ、技術のことに踏み込んで記事を書くのは結構勇気がいりました。
しかし、先日[「Systems Manager Automation Runbookの勘所」](https://qiita.com/Daha/items/e936419006aadd8de5a4)に挑戦することで、段々書く勇気が出ました。
アウトプットに挑戦してみるのは大事ですね。

以上NTTテクノクロスアドベントカレンダーの20日目、だはがお送りしました。
弊社に興味を持っていただけた方は、[こちら](https://www.ntt-tx.co.jp/)をご覧ください。
明日は[@ko_suganm](https://qiita.com/ko_suganm)さんの記事「AWS re:Invent 2024に現地参加してみた」になります。どうぞお楽しみに！Merry Christmas！