Transfer Family を使用して SFTP 経由でファイルを EFS に直接アップロードしてみた(VPCインターネット向け-鍵認証のみ編)

Transfer Family を使用して SFTP 経由でファイルを EFS に直接アップロードしてみました。 本記事ではID プロバイダーに「サービスマネージド」、エンドポイントに「VPC(インターネット)」を選択した手順をご紹介します。
2022.12.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!AWS事業本部のおつまみです。

皆さん、Transfer Family を使用して SFTP 経由でファイルを EFS に直接アップロードしたいなぁと思ったことはありますか?私はあります。

Transfer Family は、AWS ストレージサービスとの間でファイルを送受信できる安全な転送サービスです。主にこれら4つの要素を選択し、構築します。

  • プロトコル
    • SFTP (SSH ファイル転送プロトコル) - Secure Shell 経由のファイル転送
    • AS2 (Applicability Statement 2) - ビジネス間データ交換用のメッセージングプロトコル情報
    • FTPS (File Transfer Protocol Secure) - TLS 暗号化を使用したファイル転送プロトコル
    • FTP (File Transfer Protocol) - 暗号化されていないファイル転送プロトコル
  • ID プロバイダー
    • サービスマネージド - サービス内でユーザーを作成および管理
    • AWS Directory Service情報 - AWS Managed AD でユーザーを有効にする、またはオンプレミス環境または AWS で独自のセルフマネージド AD を使用する
    • カスタム ID プロバイダー - 情報任意の ID プロバイダーとの統合によりユーザーを管理する
  • エンドポイント
    • パブリックアクセス - インターネット経由でアクセス可能
    • VPC(内部) - セキュリティグループを使用したアクセスコントロール可能、VPC内のリソースからのみアクセスする場合
    • VPC(インターネット) - セキュリティグループを使用したアクセスコントロール可能、VPC外からアクセスする場合
  • ドメイン
    • Amazon S3
    • Amazon EFS

今回は以下を選択した構築方法の作業手順をご紹介します。

  • プロトコル
    • SFTP (SSH ファイル転送プロトコル) - Secure Shell 経由のファイル転送
  • ID プロバイダー
    • サービスマネージド - サービス内でユーザーを作成および管理
  • エンドポイント
    • VPC(インターネット) - セキュリティグループを使用したアクセスコントロール可能、VPC外からアクセスする場合
  • ドメイン
    • Amazon EFS

構成図

今回構築するアーキテクチャの構成図です。

ID管理はサービスマネージドを選択しているため、Transfer Familyでユーザーを作成および管理をします。 また不正にアクセスされないようセキュリティグループでIP制限を行います。

作業手順

0. 事前準備 鍵の作成

今回、SFTPプロトコルを使用してTransfer Familyと通信するため、あらかじめSSHキーを作成しておきます。

SSH キーを生成する

お使いのPCに合わせて作成して下さい。
私はMacを使用しているため、ssh-keygenコマンドでSSHキーペアを作成しました。

o2mami% ssh-keygen -t rsa -b 4096 -N "" -f test_transferfamily-key
Generating public/private rsa key pair.
Your identification has been saved in test_transferfamily-key
Your public key has been saved in test_transferfamily-key.pub
The key fingerprint is:
SHA256:Gf32lItve2epdtEKyhjBHLg9poppse+Dg9RcfLUNQ48 o2mami
The key's randomart image is:
+---[RSA 4096]----+
|       ...       |
|      . .=o      |
|    .  =oE*.     |
|     o..B+ o   . |
|  o . .oSo  o o .|
| ..o  . .  ..+ o.|
|.. * .   + ...o.o|
|. B o   . o  ooo+|
| . +o.      .o=+.|
+----[SHA256]-----+

1. VPCの作成

まずはじめにVPCを作成します。VPCサービスから[VPCを作成]を選択します。

[VPCなど]を選択し、任意のVPC名とIPv4 CIDRブロックを割り当てます。  

  • 名前: test-transferfamily-vpc(任意の名前)
  • IPv4 CIDRブロック: 10.0.0.0/28(任意)

パブリックサブネットのみ必要であるため、[パブリックサブネットの数]は1、その他はなしで作成します。

2. EIPの作成

次にTransfer Familyのエンドポイントに割り当てるEIPを作成します。EC2サービスから左側のナビゲーションペインの[Elastic IP]を選択します。

[Elastic IP アドレスを割り当てる]を選択します。

以下を選択し、[割り当て]を押下します。  

  • ネットワークボーダーグループ: ap-northeast-1  
  • パブリックIPv4アドレスプール: AmazonのIPv4アドレスプール  
  • タグ:Name: test-transferfamily-eip(任意の名前)  

下記画面のように「Elastic IPアドレス」が発行されていれば、OKです。

3. セキュリティグループの作成

次にTransfer Familyのエンドポイントに割り当てるセキュリティグループを作成します。

  • セキュリティグループ名: test-transferfamily-sg(任意の名前)
  • 説明: test-transferfamily-sg(任意の名前)
  • インバウンドルール: プロトコルタイプSSH、ソースMy IP 
    ソースはお使いする環境に併せて設定して下さい。ただし安易に0.0.0.0/0を許可するのはやめましょう。

設定後任意でタグを追加します。 追加後、[セキュリティグループを作成]を選択します。  

  • タグ:Name: test-transferfamily-sg(任意の名前)

4. EFSの作成

次にEFSを作成します。EFSサービスから、[ファイルシステムの作成]を選択します。

自動バックアップなどの他設定をカスタマイズしたい場合は、[カスタマイズ]を選択します。
今回はこのまま設定を行い、[作成]を選択します。

  • 名前: test-transferfamily-efs(任意の名前)
  • VPC: test-transferfamily-vpc(1で作成したVPC)
  • ストレージクラス: 標準 

5. IAMの作成

次にTransfer Familyのユーザーに付与するIAMロールを作成します。
このIAMロールでは、EFSへアクセスするための権限を付与します。

IAMサービスから、[ロール]を選択します。

[ロールを作成]を選択します。

設定ステップ 1 : 信頼されたエンティティを選択
以下を選択し、[次へ]を選択します。
- 信頼されたエンティティの種類: AWSのサービス
- ユース ケース: Transfer

ステップ 2 : 許可を追加 以下を選択し、[次へ]を選択します。
- 許可ポリシー: AmazonElasticFileSystemClientFullAccess

※(補足)今回は接続のためのフルアクセス権限を付与しましたが、作成したリソースのみを指定する場合はリソースポリシーは以下のように設定します。 file-system-idは[4. EFSの作成]で作成したEFSのファイルIDfs-xxxxxxxを指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RootFileSystemAccess",
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientRootAccess",
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:<region>:<account-id>:file-system/<file-system-id>"
        }
    ]
}

ステップ 3 : 名前付け、確認、作成
- ロール名: test-transferfamily-role(任意の名前)

任意でタグを追加し、[ロールを作成]を選択します。
- タグ:Name: test-transferfamily-role(任意の名前)

6. TransferFamilyの作成

最後にTransfer Familyを作成します。
Transfer Familyサービスから、[サーバを作成]を選択します。

ステップ 1:プロトコルを選択 SFTPを選択し、[次へ]を選択します。

ステップ 2:IDプロバイダーを選択 カスタムマネージドを選択し、[次へ]を選択します。

ステップ 3:エンドポイントを選択 VPCでホストインターネット向けを選択します。

以下を選択し、[次へ]を選択します。

  • アベイラビリティ ゾーン: EIPを作成したアベイラビリティゾーン
  • セキュリティグループ: 作成したセキュリティグループ ※defaultがあらかじめ設定されていますが、削除します。

ステップ 4:ドメインを選択 EFSを選択し、[次へ]を選択します。

ステップ 5:追加の詳細を設定 ここではログ記録や暗号化アルゴリズムなどの追加オプションを設定します。今回はこのまま、[次へ]を選択します。

ステップ 6:確認と作成 設定内容を確認し、[サーバを作成]を選択します。

2~3分ほどでサーバが作成されます。状態がオンラインに変わるのを待ってから、[ユーザーを追加]を選択します。

6. 接続ユーザーの作成

以下のようにユーザー設定をします。

  • ユーザー名: test-transferfamily-user(任意の名前)
  • ユーザー ID: 0 (オプション: 0 に設定すると、ルートアクセスになります)
  • グループ ID: 0 (オプション: 0 に設定すると、ルートアクセスになります)
  • ロール: test-transferfamily-role(作成したIAM)
  • ホームディレクトリ: test-transferfamily-efs(作成したEFS)

※オプションフォルダに[ユーザー名]が指定されますが、削除して下さい。初回接続はまだフォルダを作成していないため接続できません。

以下を設定し、[追加]を選択します。

  • SSHパブリックキー: はじめに作成したSSHの公開鍵を貼り付け(※改行などが入らないように気を付けて下さい。)
  • タグ:Name: test-transferfamily-user(任意の名前)

ユーザーが追加されたことを確認できました。

接続に必要なエンドポイント名を控えておきます。

接続してみた

最後に接続できるか確認してみます。

今回はSFTPクライアントソフトとしてCyberduckを使用して接続してみます。

  • プロトコル: SFTP
  • サーバ: s-xxxxxxx.amazonaws.com(TransferFamilyのエンドポイント)
  • ポート: 22
  • ユーザー名: test-transferfamily-user(作成したユーザー名)
  • SSH Private Key: test-transferfamily-key(作成した秘密鍵)

はじめて接続する場合はこのような画面が表示されます。[許可]を選択します。

問題なく接続できました!

ファイルのアップロードもダウンロードも問題なくできました。

(補足)ユーザー作成でIAMロールを指定したように、IAMでアクセス権限を付与しています。 そのためフォルダへの細かいアクセス制限はIAMポリシーで実現可能です。

リソースの削除

検証後は作成したリソースを削除しましょう。
特にTransfer Familyはサーバ停止しても、料金が発生してしまいます。
こちらの順番で削除すると、削除時にエラーが発生せず、スムーズに削除できます。

  • Transfer Familyの削除
  • EFSの削除
  • EIPの解放
  • セキュリティグループの削除
  • VPCの削除
  • IAMロールの削除

最後に

今回はTransfer Family を使用して SFTP 経由でファイルを EFS に直接アップロードしてする方法をご紹介しました。

EC2にマウントしていないEFSに直接ファイルをアップロードする方法の記事があまりなかったため、今回記事にしました。

どなたかのお役に立てれば幸いです。 最後までお読みいただきありがとうございました!

以上、おつまみ(@AWS11077)でした!

関連記事

[アップデート] AWS Transfer Family の対象ストレージに Amazon EFS が追加サポートされました | DevelopersIO

วิธีอัปโหลดไฟล์โดยตรงไปยัง EFS ด้วย Transfer Family ผ่าน SFTP | DevelopersIO

【2022年10月版】AWS Transfer Family の SFTP を使ってみた | DevelopersIO

AWS Transfer Family のSFTPをパスワード方式で接続してみた(IP制限有り) | DevelopersIO