目次

AWS Transfer Family 完全ガイド v2.0

目次


ドキュメントメタデータ

  • 最終更新: 2026-04-26
  • バージョン: v2.0
  • 対象者: B2B インテグレーション、EDI マネージャー、MFT エンジニア
  • 難易度: 中級~上級

概要と課題

本質

AWS Transfer Family は、「SFTP・FTPS・FTP・AS2 プロトコルでファイルを S3・EFS に転送するフルマネージドサービス」である。既存の FTP クライアント・スクリプト・EDI システムを変更せずに AWS ストレージに接続でき、B2B ファイル転送・バッチデータ取込・パートナー連携に使用。自社で SFTP サーバーを EC2 で運用する場合のインフラ管理負荷を完全に排除。

このサービスを選ぶ理由

なぜ Transfer Family でないといけないのか?

  1. 既存 FTP/SFTP クライアントをそのまま利用

    • サードパーティーツール・スクリプトを変更不要
    • 取引先が使用する FilleZilla・WinSCP・Cyberduck などをそのまま対応
    • レガシーシステムの段階的クラウド移行が可能
  2. SFTP サーバーのマネージド化

    • EC2 での自己構築と比較:
      • EC2 自己構築: OS パッチ、SFTP デーモン管理、ディスク容量監視、ユーザー認証管理、可用性確保を手動管理
      • Transfer Family: AWS が全て管理、99.99% SLA、自動スケール、スナップショット復旧
  3. AS2(EDI)のネイティブサポート

    • B2B EDI 取引(小売・製造・医療)で AS2 プロトコルが業界標準
    • AWS でネイティブサポートするのは Transfer Family のみ
    • メッセージ署名・暗号化・否認防止が自動実装
    • 取引先との EDI パートナーシップセットアップ工数を大幅削減
  4. Lambda・EventBridge・Step Functions との統合

    • ファイル受信トリガーで自動処理パイプライン
    • ファイル変換、データベース更新、通知を自動化
    • 受信ファイルをそのまま保存するだけでなく、イベント駆動で複数アクションを連鎖実行
  5. 複数認証方式のサポート

    • SSH キー(セキュア)
    • パスワード(従来型)
    • Lambda カスタム IdP(Active Directory 統合可)
    • 柔軟な認証を既存システムに合わせられる

このサービスを選ばない理由

  • 単純な S3 アップロード: Presigned URL で十分
  • ローカルファイル同期: AWS DataSync が適切
  • リアルタイムストリーミング: Kinesis が必要

アーキテクチャと設計

全体構成

外部パートナー / クライアント
    ↓ SFTP(22) / FTPS(21/990) / FTP(21) / AS2(4443)
    
AWS Transfer Family サーバー(フルマネージド、99.99% SLA)
    ├─ 認証レイヤー
    │  ├─ SSH キー認証(SFTP)
    │  ├─ パスワード認証
    │  ├─ Lambda カスタム IdP(Active Directory 統合)
    │  └─ AWS IAM ロール
    │
    ├─ ホームディレクトリマッピング
    │  ├─ Logical: /partners/acme → s3://bucket/partners/acme
    │  └─ Physical: /home/user
    │
    ├─ セキュリティ
    │  ├─ VPC エンドポイント(プライベート接続)
    │  ├─ Elastic IP(固定 IP)
    │  ├─ セキュリティグループ
    │  └─ KMS 暗号化
    │
    └─ ログ・監視
       ├─ CloudWatch Logs
       ├─ CloudTrail
       └─ EventBridge トリガー
            ↓
S3 バケット / EFS ファイルシステム
    ├─ ファイル保存
    ├─ ライフサイクルポリシー
    └─ バージョニング

mermaid ダイアグラム 1: プロトコル別の使い分け

graph TB
    subgraph ClientType["クライアントタイプ"]
        Individual["個別パートナー<br/>FilleZilla等"]
        Legacy["レガシーシステム<br/>FTP スクリプト"]
        EDI["EDI 統合<br/>取引システム"]
        Interactive["インタラクティブ<br/>WinSCP等"]
    end
    
    subgraph Protocol["プロトコル選択"]
        SFTP["SFTP(SSH)<br/>暗号化・鍵認証<br/>推奨"]
        FTPS["FTPS<br/>暗号化・パスワード<br/>従来型"]
        FTP["FTP<br/>平文(使用避け)<br/>レガシー"]
        AS2["AS2<br/>EDI 標準<br/>B2B 必須"]
    end
    
    subgraph Feature["主な機能"]
        Features["署名・否認防止<br/>メッセージ確認"]
    end
    
    Individual --> SFTP
    Legacy --> FTPS
    Interactive --> SFTP
    EDI --> AS2
    
    SFTP -.->|セキュア| Feature
    AS2 -->|EDI標準| Feature

mermaid ダイアグラム 2: VPC エンドポイント vs Public

graph LR
    subgraph Internet["インターネット"]
        Partner["パートナー<br/>企業"]
    end
    
    subgraph AWS["AWS"]
        subgraph VPC["VPC"]
            Private["Private Endpoint<br/>セキュア<br/>固定IP"]
            Public["Public Endpoint<br/>インターネット<br/>スケーラブル"]
        end
        S3["S3 バケット"]
    end
    
    Partner -->|SFTP/22| Public
    Public --> S3
    
    Private -->|VPC内のみ| S3

プロトコル別機能

1. SFTP(SSH File Transfer Protocol)

推奨度: ⭐⭐⭐⭐⭐ 最推奨

  • セキュリティ: 暗号化 + SSH キー / パスワード
  • ポート: 22(標準)
  • クライアント: WinSCP, Cyberduck, FileZilla, rsync, scp
  • ユースケース: 個別パートナー、セキュアファイル転送

メリット:

  • SSH キー(最高レベルセキュリティ)
  • 暗号化通信
  • 広範なクライアント互換性
  • Linux/Mac ネイティブ対応(scp/rsync)

デメリット:

  • 初期セットアップが若干複雑(SSH キー生成など)

2. FTPS(FTP over TLS/SSL)

推奨度: ⭐⭐⭐ 従来型環境向け

  • セキュリティ: TLS/SSL 暗号化 + パスワード
  • ポート: 21(通常)、990(暗黙的 TLS)
  • クライアント: FileZilla(FTPS 対応)、Legacy FTP ツール
  • ユースケース: 既存 FTP システム置き換え、暗号化必須

メリット:

  • FTP からの段階的移行
  • パスワード認証で既存運用維持
  • 暗号化対応

デメリット:

  • SSH キー管理不要だが従来型セキュリティ
  • パッシブモードの複雑性

3. FTP(File Transfer Protocol)

推奨度: ⭐ 非推奨

  • セキュリティ: なし(平文)
  • ポート: 21
  • 使用状況: レガシーシステムのみ

注意: パスワードが平文送信。本番環境での使用は避けるべき。

4. AS2(Applicability Statement 2)

推奨度: ⭐⭐⭐⭐⭐ EDI 環境では必須

  • 用途: EDI(電子データ交換)の業界標準
  • 対応業界: 小売、製造、医療、保険、物流
  • 機能: メッセージ署名、暗号化、MDN(配信確認)
  • セキュリティ: デジタル署名で否認防止を保証

AS2 フロー:

送信側システム
    ↓ EDI メッセージ作成(ORDERS, INVOIC など)
    ↓ メッセージ署名(デジタル署名)
    ↓ 暗号化
    
Transfer Family AS2
    ↓ MDN(Message Disposition Notification)
    ↓ 受信確認応答
    
受信側システム
    ↓ メッセージ検証(署名確認)
    ↓ 復号化
    ↓ EDI メッセージ処理

エンドポイント・認証方式

エンドポイント種別

1. Public エンドポイント

接続方式: インターネット経由(www.example.com)
IP: 動的割り当て(自動スケール対応)
セキュリティグループ: SFTP(22), FTPS(21), FTP(21), AS2(4443) を開放
ルーティング: AWS が管理
推奨: ほとんどのユースケース

設定例:

aws transfer create-server \
  --endpoint-type PUBLIC \
  --protocols SFTP FTPS \
  --logging-role arn:aws:iam::123456789012:role/TransferLoggingRole

2. VPC エンドポイント

接続方式: VPC 内のみ(プライベート接続)
IP: Elastic IP で固定 IP をサポート
セキュリティ: VPC セキュリティグループで制御
スケーラビリティ: 複数 AZ で高可用性
推奨: エンタープライズ、プライベートネットワーク接続が必須

設定例:

aws transfer create-server \
  --endpoint-type VPC \
  --endpoint-details '{
    "VpcId": "vpc-12345678",
    "SubnetIds": ["subnet-a", "subnet-b"],
    "SecurityGroupIds": ["sg-sftp"],
    "AddressAllocationIds": ["eipalloc-xxx", "eipalloc-yyy"]
  }' \
  --protocols SFTP

認証方式

1. SERVICE_MANAGED(デフォルト)

AWS が Transfer Family コンソールでユーザー・パスワード・SSH キーを管理。

# ユーザー作成
aws transfer create-user \
  --server-id s-abcd1234 \
  --user-name "partner-acme" \
  --role "arn:aws:iam::123456789012:role/SFTPUserRole" \
  --home-directory "/my-sftp-bucket/partners/acme" \
  --home-directory-type LOGICAL \
  --ssh-public-key-body "ssh-rsa AAAA..."

メリット:

  • AWS コンソールで直感的に管理
  • SSH キー・パスワードを AWS IAM ロール与で保護

2. CUSTOM(Lambda カスタム IdP)

Lambda 関数で認証ロジックをカスタマイズ。Active Directory 統合など。

# Lambda 認証関数
import ldap3
import json

def lambda_handler(event, context):
    username = event.get('username')
    password = event.get('password')
    
    # Active Directory で検証
    server = ldap3.Server('ldap://ad.company.com')
    conn = ldap3.Connection(
        server,
        user=f'company\\{username}',
        password=password
    )
    
    if not conn.bind():
        return {}  # 認証失敗
    
    # 認証成功 → ホームディレクトリと IAM ロール返却
    return {
        'HomeDirectory': f'/company-bucket/users/{username}',
        'HomeDirectoryType': 'LOGICAL',
        'Role': 'arn:aws:iam::123456789012:role/SFTPUserRole',
        'HomeDirectoryDetails': json.dumps([
            {'Entry': '/', 'Target': f'/company-bucket/users/{username}'}
        ])
    }

メリット:

  • Active Directory・LDAP 統合
  • 複雑な認証ロジック対応
  • 動的なホームディレクトリ割り当て

SFTP Connectors

概要(2025 新機能)

オンプレミスや外部 SFTP サーバーからのファイル転送を自動化。Transfer Family から外部 SFTP サーバーに接続してファイル取得・アップロードを実行。

主な機能(2025-2026)

1. VPC-Based Connectivity(2025-10)

SFTP Connector から VPC 内のリソースへの接続が可能に。

# VPC ベースの SFTP Connector を作成
aws transfer create-connector \
  --url "sftp://internal-sftp.internal.example.com" \
  --authentication-type "PASSWORD" \
  --username "transfer-user" \
  --security-group-ids ["sg-vpc-sftp"] \
  --subnet-ids ["subnet-private-1", "subnet-private-2"]

2. ファイル操作拡張(2025-04)

Connector が削除・リネーム・移動に対応。

# リモート SFTP サーバー上でファイル削除
aws transfer delete-file \
  --connector-id c-12345678 \
  --remote-file-path "/uploads/old-file.txt"

# リモートファイルをリネーム
aws transfer update-file \
  --connector-id c-12345678 \
  --old-file-path "/uploads/file.txt" \
  --new-file-path "/uploads/file-processed.txt"

3. IPv6 サポート(2026-04)

Dual-stack(IPv4 + IPv6)対応で、IPv6 環境への接続をサポート。

# IPv6 enabled Connector
aws transfer create-connector \
  --url "sftp://[2001:db8::1]:22" \
  --address-family "ANY"  # IPv4/IPv6 両対応

Web Apps

概要(2024-12 新機能)

Web ブラウザで S3 にアクセスするポータルを提供。ファイルアップロード・ダウンロードが GUI で可能。

アーキテクチャ

エンドユーザー
    ↓ Web ブラウザ(HTTPS)
    
Transfer Family Web App
    ├─ 認証(Cognito など)
    ├─ ファイルリスト表示
    ├─ アップロード機能
    └─ ダウンロード機能
        ↓
S3 バケット

機能

✅ ファイルブラウジング(ツリー表示)
✅ アップロード(ドラッグ&ドロップ)
✅ ダウンロード(単一・複数選択)
✅ ファイル削除(オプション)
✅ ブランディング(カスタムロゴなど)
✅ ユーザー管理(パスワード・MFA)

設定例

# Web App を作成
aws transfer create-web-app \
  --server-id s-abcd1234 \
  --access-endpoint "https://mycompany.transfer.aws.com" \
  --authentication-type "SERVICE_MANAGED" \
  --identity-provider-type "SERVICE_MANAGED"

IPv6 対応(2026-04)

Web App への接続を IPv6 で可能に。

# IPv6 enabled Web App
aws transfer create-web-app \
  --server-id s-abcd1234 \
  --address-family "ANY"  # IPv4/IPv6

Managed Workflows

概要

ファイル受信後の自動処理パイプラインを定義・実行。タグ付け、ウイルススキャン、ファイル変換を自動化。

ワークフローステップ

ファイル受信
    ↓
1. タグ付け(S3 メタデータ)
    ↓
2. カスタム処理(Lambda 実行)
    ↓
3. ファイル操作(コピー・削除・移動)
    ↓
4. 通知(SNS・EventBridge)
    ↓
完了

実装例

# Workflow を作成
aws transfer create-workflow \
  --description "SFTP Upload Auto-Processing" \
  --steps '[
    {
      "Type": "TAG",
      "TagStepDetails": {
        "Name": "TagUploadedFile",
        "Tags": [
          {"Key": "Status", "Value": "uploaded"},
          {"Key": "Processor", "Value": "${transfer:UserName}"},
          {"Key": "Timestamp", "Value": "${transfer:UploadDate}"}
        ]
      }
    },
    {
      "Type": "CUSTOM",
      "CustomStepDetails": {
        "Name": "ScanVirus",
        "Target": "arn:aws:lambda:ap-northeast-1:123456789012:function:malware-scan",
        "TimeoutSeconds": 300
      }
    },
    {
      "Type": "COPY",
      "CopyStepDetails": {
        "Name": "CopyToArchive",
        "DestinationFileLocation": {
          "S3FileLocation": {
            "Bucket": "archive-bucket",
            "Key": "${transfer:UploadDate}/${transfer:FileName}"
          }
        }
      }
    },
    {
      "Type": "CUSTOM",
      "CustomStepDetails": {
        "Name": "NotifyCompletion",
        "Target": "arn:aws:sns:ap-northeast-1:123456789012:transfer-notifications"
      }
    }
  ]'

Workflow トリガー設定

# Server に Workflow をアタッチ
aws transfer create-server \
  --protocols SFTP \
  --workflow-details '{
    "OnUpload": [
      {
        "WorkflowId": "wf-12345678",
        "ExecutionRole": "arn:aws:iam::123456789012:role/TransferWorkflowRole"
      }
    ]
  }'

主要ユースケース

1. 小売業のサプライヤー統合

シナリオ: 300 社のサプライヤーが毎日の発注データ(CSV/EDI)を SFTP で送信

Solution:

  • SFTP Server を Transfer Family で作成
  • サプライヤー別にホームディレクトリを分離
  • ファイル受信 → Lambda で CSV 解析 → DynamoDB に反映
  • EventBridge で在庫管理システムに通知

実装:

# SFTP サーバー作成
aws transfer create-server --protocols SFTP

# サプライヤーごとにユーザー作成
for supplier in {1..300}; do
  aws transfer create-user \
    --server-id s-xxx \
    --user-name "supplier-$supplier" \
    --home-directory "/sftp-bucket/suppliers/supplier-$supplier"
done

# EventBridge ルール: S3 PUT イベント → Lambda
aws events put-rule --name transfer-file-received \
  --event-pattern '{
    "source": ["aws.s3"],
    "detail-type": ["Object Created"],
    "detail": {"bucket": {"name": ["sftp-bucket"]}}
  }'

結果: 手動ファイル処理 → 自動化、在庫反応時間 24h → 1h

2. 金融機関の EDI 接続

シナリオ: メガバンクと外国為替取引データを AS2 で授受

Solution:

  • AS2 プロトコルで電子署名・暗号化を自動実装
  • MDN(配信確認)で否認防止を保証
  • 取引データの完全性を技術的に保証

実装:

# AS2 Server を作成
aws transfer create-server \
  --protocols AS2 \
  --endpoint-type VPC  # セキュアな VPC 接続

# AS2 パートナー設定
aws transfer create-connector \
  --as2-config '{
    "Compression": "ZLIB",
    "EncryptionAlgorithm": "AES128_CBC",
    "SigningAlgorithm": "SHA2_256",
    "MdnResponse": "SYNC"
  }'

結果: 取引の法的証拠を自動記録、監査対応が容易

3. 医療機関のデータ受信

シナリオ: クリニックから診断データ(HL7/DICOM)を毎日受信・自動取込

Solution:

  • SFTP で診断データを受信
  • Lambda で HL7/DICOM フォーマット変換
  • 自動的に電子カルテシステムに取込

実装:

# Managed Workflow で自動処理パイプライン
aws transfer create-workflow --steps '[
  {
    "Type": "TAG",
    "TagStepDetails": {
      "Tags": [{"Key": "MedicalData", "Value": "true"}]
    }
  },
  {
    "Type": "CUSTOM",
    "CustomStepDetails": {
      "Target": "arn:aws:lambda:.../hl7-converter"
    }
  },
  {
    "Type": "CUSTOM",
    "CustomStepDetails": {
      "Target": "arn:aws:lambda:.../ehr-import"
    }
  }
]'

結果: 診断データ受信 → EHR 反映(完全自動化)

4. 製造業の CAD ファイル受信

シナリオ: パートナー企業が CAD ファイルを受信 → ウイルススキャン → 承認フロー

Solution:

  • SFTP Connector でパートナーの SFTP から自動取得
  • Lambda でウイルススキャン(ClamAV)
  • SNS で設計者に通知
  • EventBridge で承認フロー連携

5. バッチデータ処理の統合

シナリオ: 日次でファイルを複数ソースから受信 → 統合処理 → 分析

Solution:

  • Multiple Transfer Family servers(複数のパートナー向け)
  • EventBridge で全ファイル受信を集約
  • AWS Glue で ETL 実行
  • Athena で分析

設定・操作の具体例

AWS CLI / SDK による実装

1. SFTP Server の作成とユーザー設定

#!/bin/bash

# Step 1: SFTP Server を作成
SERVER_ID=$(aws transfer create-server \
  --protocols SFTP \
  --endpoint-type PUBLIC \
  --identity-provider-type SERVICE_MANAGED \
  --logging-role arn:aws:iam::123456789012:role/TransferLoggingRole \
  --tags "Key=Environment,Value=Production" \
  --query 'ServerId' --output text)

echo "Server created: $SERVER_ID"

# Step 2: SSH キーペアを生成
ssh-keygen -t rsa -b 4096 -f /tmp/sftp-user-key -N ""

# Step 3: ユーザーを作成(SSH キー認証)
aws transfer create-user \
  --server-id $SERVER_ID \
  --user-name "partner-acme" \
  --role arn:aws:iam::123456789012:role/SFTPUserRole \
  --home-directory "/my-sftp-bucket/partners/acme" \
  --home-directory-type LOGICAL \
  --home-directory-mappings '[{
    "Entry": "/",
    "Target": "/my-sftp-bucket/partners/acme"
  }]' \
  --ssh-public-key-body "$(cat /tmp/sftp-user-key.pub)"

# Step 4: クライアント側でマウント
# sftp -i /tmp/sftp-user-key partner-acme@sftp.transfer.amazonaws.com
# sftp> ls
# sftp> put file.txt

2. Lambda カスタム認証(Active Directory 統合)

# lambda_function.py
import ldap3
import json
import os

def lambda_handler(event, context):
    """Active Directory で SFTP ユーザーを認証"""
    
    server_id = event.get('serverId')
    username = event.get('username')
    password = event.get('password')
    
    # Active Directory サーバーに接続
    ad_server = os.environ['AD_SERVER']  # ldap://ad.company.com
    ad_domain = os.environ['AD_DOMAIN']  # company.com
    
    try:
        server = ldap3.Server(ad_server, get_info=ldap3.ALL)
        
        # NTLM 認証でバインド
        conn = ldap3.Connection(
            server,
            user=f'{ad_domain}\\{username}',
            password=password,
            authentication=ldap3.NTLM
        )
        
        if not conn.bind():
            print(f"Authentication failed for user {username}")
            return {}  # 認証失敗 → 空レスポンス
        
        # 認証成功 → ユーザー情報を返却
        return {
            'Username': username,
            'HomeDirectory': f'/company-bucket/users/{username}',
            'HomeDirectoryType': 'LOGICAL',
            'Role': 'arn:aws:iam::123456789012:role/SFTPUserRole',
            'HomeDirectoryDetails': json.dumps([
                {'Entry': '/', 'Target': f'/company-bucket/users/{username}'}
            ]),
            'PosixProfile': {
                'Uid': 1000,
                'Gid': 1000,
                'SecondaryGids': []
            }
        }
    
    except Exception as e:
        print(f"Error: {str(e)}")
        return {}

3. EventBridge + Lambda による自動処理

# SFTP ファイル受信 → Lambda 処理を自動トリガー

# EventBridge ルール
aws events put-rule \
  --name transfer-file-received \
  --event-pattern '{
    "source": ["aws.s3"],
    "detail-type": ["Object Created"],
    "detail": {
      "bucket": {"name": ["my-sftp-bucket"]},
      "object": {"key": [{"prefix": "partners/"}]}
    }
  }'

# Lambda ターゲット
aws events put-targets \
  --rule transfer-file-received \
  --targets "Id"="1","Arn"="arn:aws:lambda:ap-northeast-1:123456789012:function:process-transfer-file"

# Lambda 関数
cat > lambda_handler.py << 'EOF'
import boto3
import json

s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):
    # S3 オブジェクト情報を取得
    bucket = event['detail']['bucket']['name']
    key = event['detail']['object']['key']
    
    print(f"Processing: {bucket}/{key}")
    
    # S3 からファイルの内容を読み込み
    response = s3.get_object(Bucket=bucket, Key=key)
    content = response['Body'].read().decode('utf-8')
    
    # CSV を解析
    lines = content.split('\n')
    headers = lines[0].split(',')
    
    # DynamoDB に保存
    table = dynamodb.Table('inventory')
    for line in lines[1:]:
        if line:
            values = line.split(',')
            item = {header: value for header, value in zip(headers, values)}
            table.put_item(Item=item)
    
    return {
        'statusCode': 200,
        'body': json.dumps(f'Processed {len(lines)-1} records')
    }
EOF

4. Terraform による完全な IaC

# main.tf: Transfer Family + EventBridge + Lambda

# IAM ロール(Transfer Family ログ用)
resource "aws_iam_role" "transfer_logging" {
  name = "TransferLoggingRole"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Action = "sts:AssumeRole"
      Effect = "Allow"
      Principal = {
        Service = "transfer.amazonaws.com"
      }
    }]
  })
}

resource "aws_iam_role_policy" "transfer_logging" {
  name = "TransferLoggingPolicy"
  role = aws_iam_role.transfer_logging.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect = "Allow"
      Action = [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ]
      Resource = "arn:aws:logs:*:*:*"
    }]
  })
}

# SFTP Server
resource "aws_transfer_server" "sftp" {
  identity_provider_type = "SERVICE_MANAGED"
  endpoint_type         = "PUBLIC"
  protocols            = ["SFTP"]
  logging_role         = aws_iam_role.transfer_logging.arn
  force_destroy        = false

  tags = {
    Environment = "Production"
  }
}

# SFTP ユーザー
resource "aws_transfer_user" "partner" {
  for_each = {
    acme    = "arn:aws:iam::123456789012:role/SFTPUserRole"
    globex  = "arn:aws:iam::123456789012:role/SFTPUserRole"
  }

  server_id       = aws_transfer_server.sftp.id
  user_name       = "partner-${each.key}"
  role           = each.value
  home_directory = "/my-sftp-bucket/partners/${each.key}"

  home_directory_mappings {
    entry  = "/"
    target = "/my-sftp-bucket/partners/${each.key}"
  }

  home_directory_type = "LOGICAL"
}

# S3 バケット
resource "aws_s3_bucket" "sftp_data" {
  bucket = "my-sftp-bucket"
}

# EventBridge ルール
resource "aws_cloudwatch_event_rule" "transfer_file_received" {
  name        = "transfer-file-received"
  description = "Trigger on SFTP file upload"

  event_pattern = jsonencode({
    source      = ["aws.s3"]
    detail-type = ["Object Created"]
    detail = {
      bucket = {
        name = [aws_s3_bucket.sftp_data.id]
      }
    }
  })
}

# Lambda ターゲット
resource "aws_cloudwatch_event_target" "lambda" {
  rule     = aws_cloudwatch_event_rule.transfer_file_received.name
  arn      = aws_lambda_function.process_file.arn
  role_arn = aws_iam_role.eventbridge.arn
}

# Lambda 関数
resource "aws_lambda_function" "process_file" {
  filename      = "lambda_function.zip"
  function_name = "process-transfer-file"
  role          = aws_iam_role.lambda.arn
  handler       = "index.lambda_handler"
  runtime       = "python3.11"

  environment {
    variables = {
      DYNAMODB_TABLE = aws_dynamodb_table.inventory.name
    }
  }
}

output "transfer_server_id" {
  value = aws_transfer_server.sftp.id
}

類似サービス比較

項目 Transfer Family EC2 SFTP Server Azure Blob Cerberus FTP GoAnywhere
価格モデル ホスト時間 + 転送量 EC2 + ディスク Blob storage 買切(高額) SaaS(月額)
管理 フルマネージド 自己管理 Azure 統合 複雑 SaaS(簡単)
プロトコル SFTP/FTPS/FTP/AS2 SFTP のみ WebDAV/REST 多数 SFTP/HTTP
SLA 99.99% 自身で管理 99.99% N/A 99.9%
スケーラビリティ 自動スケール 手動管理 自動スケール 限定的 クラウドベース
統合 AWS ネイティブ AWS EC2 Azure ネイティブ スタンドアロン 独立系

選択基準

  • AWS 環境 + フルマネージド: Transfer Family
  • オンプレミス + 自己管理: EC2 SFTP Server
  • Azure 統合: Azure Blob/DataSync
  • 高度なセキュリティ: Cerberus FTP / GoAnywhere

ベストプラクティス

✅ 推奨事項

  1. SFTP を優先採用

    • SSH キーで最高レベルセキュリティ
    • 広範なクライアント互換性
  2. ホームディレクトリで多テナント分離

    • パートナーごとにディレクトリ分割
    • IAM ロールでアクセス制限
  3. VPC エンドポイントでプライベート接続

    • インターネット不要で高セキュリティ
    • エンタープライズ環境推奨
  4. Managed Workflows で自動化

    • 受信ファイルの自動処理
    • ウイルススキャン、フォーマット変換
  5. CloudTrail + Access Logging で監査

    • 全アップロード・ダウンロードを記録
    • コンプライアンス対応
  6. タグで容易なコスト分析

    • Department: Sales, Partner: ACME などでタグ付け
    • Cost Explorer で部門別追跡
  7. EventBridge で イベント駆動アーキテクチャ

    • ファイル受信 → Lambda 自動実行
    • 複数リソースと連携
  8. Lambda カスタム認証で既存 IdP 統合

    • Active Directory と連携
    • ユーザー管理を一元化

❌ アンチパターン

  1. FTP(暗号化なし)の使用 → パスワードが平文送信 → 対策: SFTP または FTPS

  2. 全パートナーに同一 IAM ロール → データ漏洩リスク → 対策: パートナーごとに分離ロール

  3. Managed Workflows なしの手動処理 → スケール時に運用負荷増加 → 対策: 自動化パイプライン構築

  4. 監査ログなし → コンプライアンス要件未達成 → 対策: CloudTrail 有効化

  5. Public エンドポイントのセキュリティグループ不適切 → 不正アクセスリスク → 対策: 信頼できる IP/CIDR のみ許可

  6. AS2 設定なしで EDI 処理 → 法的証拠がない → 対策: AS2 で署名・暗号化

  7. 復旧計画なし → ファイル損失時の対応不明 → 対策: バックアップ + リストア手順書


トラブルシューティング

症状 原因 対策
SFTP 接続失敗 セキュリティグループで 22 番ポート閉鎖 セキュリティグループで SFTP(22) 開放確認
SSH キー認証失敗 キー形式不正(PuTTY 形式など) ssh-keygen -t rsa -b 4096 で RSA キー生成
ホームディレクトリアクセス失敗 IAM ロール権限不足 s3:GetObject, s3:PutObject 権限確認
Managed Workflow 実行失敗 Lambda 実行ロール権限不足 CloudWatch Logs で Lambda エラー確認
EventBridge トリガーなし イベントパターン不正 aws events test-event-pattern でパターン検証
AS2 メッセージ検証失敗 署名アルゴリズム不一致 送受信側で同じ署名アルゴリズムを確認
Web App ログイン失敗 Cognito 設定なし 認証プロバイダーを SERVICE_MANAGED に設定

2025-2026 最新動向

1. SFTP Connectors(2025-04, 10)

VPC 接続対応: SFTP Connector から VPC 内のリソースへの直接接続が可能に。

ファイル操作拡張: 削除・リネーム・移動の自動化。

監視機能: Connector のステータス・エラーを CloudWatch で監視。

2. IPv6 サポート(2026-04)

Connector: IPv6 アドレスで外部 SFTP サーバーへの接続対応。

Web Apps: IPv6 クライアントから Web App への接続対応。

Dual-stack: IPv4・IPv6 両対応で段階的移行を実現。

3. セキュリティ強化

GuardDuty 統合: ファイル転送の異常検知。

VPC エンドポイント強化: Private Link のさらなる最適化。


学習リソース

公式ドキュメント

AWS ブログ

相互比較

  • Cerberus FTP Server: 高機能スタンドアロン
  • GoAnywhere MFT: エンタープライズ SaaS
  • IBM Sterling: B2B/EDI 統合

実装例

小規模(単一パートナー向け)

# シンプルな SFTP サーバー
aws transfer create-server --protocols SFTP

# ユーザー 1 人
aws transfer create-user \
  --server-id s-xxx \
  --user-name partner1 \
  --home-directory /sftp-bucket/partner1

# monthly cost: $0.30 (server) + $0.04/GB (transfer)

中規模(複数パートナー + 自動処理)

# Terraform: 10 パートナー向け SFTP + Managed Workflows

resource "aws_transfer_server" "sftp" {
  protocols               = ["SFTP"]
  endpoint_type          = "PUBLIC"
  identity_provider_type = "SERVICE_MANAGED"
  
  workflow_details {
    on_upload {
      execution_role = aws_iam_role.workflow.arn
      workflow_id    = aws_transfer_workflow.process.id
    }
  }
}

resource "aws_transfer_workflow" "process" {
  steps = [
    # タグ付け
    {
      type = "TAG"
      tag_step_details = {
        tags = [
          { key = "Status", value = "received" }
        ]
      }
    },
    # Lambda 処理
    {
      type = "CUSTOM"
      custom_step_details = {
        target = aws_lambda_function.process.arn
      }
    }
  ]
}

# monthly cost: $0.30 (server) + $20-50 (transfer, workflow execution)

大規模エンタープライズ

#!/bin/bash
# 複数 AS2 サーバー + Lambda カスタム認証 + VPC エンドポイント

# リージョン別に複数サーバーデプロイ
for region in ap-northeast-1 eu-west-1 us-east-1; do
  aws transfer create-server \
    --protocols SFTP FTPS AS2 \
    --endpoint-type VPC \
    --identity-provider-type LAMBDA \
    --identity-provider-details "Function=arn:aws:lambda:$region:.../idp" \
    --region $region
done

# CloudTrail + VPC Flow Logs で全トラフィック監視
aws cloudtrail create-trail --s3-bucket-name audit-trails --trail-name transfer-audit

# monthly cost: $0.30 × 3 servers + $100-500 (transfer, Glue processing, Lambda)

導入ロードマップ

Phase 1: 計画・PoC(2-4 週間)

  • [ ] 現行ファイル転送方式の把握
  • [ ] プロトコル選択(SFTP/FTPS/AS2)
  • [ ] セキュリティ要件確認
  • [ ] PoC 環境構築

Phase 2: パイロット(1-2 か月)

  • [ ] 単一パートナーでのテスト
  • [ ] ファイル転送フロー検証
  • [ ] 自動処理(Managed Workflows)の実装
  • [ ] パフォーマンス・セキュリティ評価

Phase 3: 本番展開(2-4 か月)

  • [ ] 複数パートナーの移行
  • [ ] Lambda カスタム認証設定
  • [ ] CloudTrail・監査ログ有効化
  • [ ] チーム トレーニング

Phase 4: 最適化

  • [ ] AS2・EDI の活用(必要に応じて)
  • [ ] Web Apps の導入(オプション)
  • [ ] SFTP Connectors で外部システム連携
  • [ ] IPv6 への段階的移行(2026+)

まとめ

AWS Transfer Family は 既存 FTP/SFTP クライアント・スクリプト・EDI システムをそのまま使いながら AWS ストレージに接続するフルマネージドサービス

主な価値

  1. プロトコル互換: SFTP/FTPS/FTP/AS2 ネイティブサポート
  2. インフラレス: サーバー管理・パッチ・可用性を AWS が管理
  3. 自動化: Managed Workflows で受信ファイルの自動処理
  4. セキュリティ: SSH キー、VPC エンドポイント、AS2 署名
  5. 統合: Lambda・EventBridge・Step Functions との連携

次のステップ

  1. プロトコル決定: SFTP 推奨(セキュリティ・互換性)
  2. アーキテクチャ設計: パブリック vs VPC エンドポイント
  3. 自動化計画: Managed Workflows で自動処理パイプライン
  4. セキュリティ強化: Lambda カスタム認証、CloudTrail

注意事項

  • FTP(暗号化なし)は避ける
  • パートナーごとにホームディレクトリ分離
  • EDI は AS2 で署名・否認防止を実装
  • 監査ログ(CloudTrail)を必ず有効化

最終更新: 2026-04-26 バージョン: v2.0