目次
AWS Transfer Family 完全ガイド v2.0
目次
- ドキュメントメタデータ
- 概要と課題
- アーキテクチャと設計
- プロトコル別機能
- エンドポイント・認証方式
- SFTP Connectors
- Web Apps
- Managed Workflows
- 主要ユースケース
- 設定・操作の具体例
- 類似サービス比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例
- 導入ロードマップ
- まとめ
ドキュメントメタデータ
- 最終更新: 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 でないといけないのか?
-
既存 FTP/SFTP クライアントをそのまま利用
- サードパーティーツール・スクリプトを変更不要
- 取引先が使用する FilleZilla・WinSCP・Cyberduck などをそのまま対応
- レガシーシステムの段階的クラウド移行が可能
-
SFTP サーバーのマネージド化
- EC2 での自己構築と比較:
- EC2 自己構築: OS パッチ、SFTP デーモン管理、ディスク容量監視、ユーザー認証管理、可用性確保を手動管理
- Transfer Family: AWS が全て管理、99.99% SLA、自動スケール、スナップショット復旧
- EC2 での自己構築と比較:
-
AS2(EDI)のネイティブサポート
- B2B EDI 取引(小売・製造・医療)で AS2 プロトコルが業界標準
- AWS でネイティブサポートするのは Transfer Family のみ
- メッセージ署名・暗号化・否認防止が自動実装
- 取引先との EDI パートナーシップセットアップ工数を大幅削減
-
Lambda・EventBridge・Step Functions との統合
- ファイル受信トリガーで自動処理パイプライン
- ファイル変換、データベース更新、通知を自動化
- 受信ファイルをそのまま保存するだけでなく、イベント駆動で複数アクションを連鎖実行
-
複数認証方式のサポート
- 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
ベストプラクティス
✅ 推奨事項
-
SFTP を優先採用
- SSH キーで最高レベルセキュリティ
- 広範なクライアント互換性
-
ホームディレクトリで多テナント分離
- パートナーごとにディレクトリ分割
- IAM ロールでアクセス制限
-
VPC エンドポイントでプライベート接続
- インターネット不要で高セキュリティ
- エンタープライズ環境推奨
-
Managed Workflows で自動化
- 受信ファイルの自動処理
- ウイルススキャン、フォーマット変換
-
CloudTrail + Access Logging で監査
- 全アップロード・ダウンロードを記録
- コンプライアンス対応
-
タグで容易なコスト分析
- Department: Sales, Partner: ACME などでタグ付け
- Cost Explorer で部門別追跡
-
EventBridge で イベント駆動アーキテクチャ
- ファイル受信 → Lambda 自動実行
- 複数リソースと連携
-
Lambda カスタム認証で既存 IdP 統合
- Active Directory と連携
- ユーザー管理を一元化
❌ アンチパターン
-
FTP(暗号化なし)の使用 → パスワードが平文送信 → 対策: SFTP または FTPS
-
全パートナーに同一 IAM ロール → データ漏洩リスク → 対策: パートナーごとに分離ロール
-
Managed Workflows なしの手動処理 → スケール時に運用負荷増加 → 対策: 自動化パイプライン構築
-
監査ログなし → コンプライアンス要件未達成 → 対策: CloudTrail 有効化
-
Public エンドポイントのセキュリティグループ不適切 → 不正アクセスリスク → 対策: 信頼できる IP/CIDR のみ許可
-
AS2 設定なしで EDI 処理 → 法的証拠がない → 対策: AS2 で署名・暗号化
-
復旧計画なし → ファイル損失時の対応不明 → 対策: バックアップ + リストア手順書
トラブルシューティング
| 症状 | 原因 | 対策 |
|---|---|---|
| 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 ストレージに接続するフルマネージドサービス。
主な価値
- プロトコル互換: SFTP/FTPS/FTP/AS2 ネイティブサポート
- インフラレス: サーバー管理・パッチ・可用性を AWS が管理
- 自動化: Managed Workflows で受信ファイルの自動処理
- セキュリティ: SSH キー、VPC エンドポイント、AS2 署名
- 統合: Lambda・EventBridge・Step Functions との連携
次のステップ
- プロトコル決定: SFTP 推奨(セキュリティ・互換性)
- アーキテクチャ設計: パブリック vs VPC エンドポイント
- 自動化計画: Managed Workflows で自動処理パイプライン
- セキュリティ強化: Lambda カスタム認証、CloudTrail
注意事項
- FTP(暗号化なし)は避ける
- パートナーごとにホームディレクトリ分離
- EDI は AS2 で署名・否認防止を実装
- 監査ログ(CloudTrail)を必ず有効化
最終更新: 2026-04-26 バージョン: v2.0