AWS Transfer Family for FTP(カスタムIDプロバイダー)を利用しFTPでS3へアクセスしてみる

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、AWS Transfer Family for FTP(カスタムIDプロバイダー)を利用し、FTPでS3へアクセスしてみたため、ブログに記載いたします。

またAWS Transfer Family for FTPでは、IDプロバイダーとして、サービスマネージドを利用することができないため、 AWS Directory ServiceまたはカスタイムIDプロバイダーを利用する必要があります。

なお、カスタムIDプロバイダーでは、LambdaまたはAPI Gatewayを利用することができますが、 今回はLambdaを使う方法を記載いたします。

参考

カスタム ID プロバイダーの使用 - AWS Transfer Family

概要図

流れ

①AWS Transfer Family for FTP用Security Groupの作成
②S3へアクセスできるIAMポリシーの作成
③AWS Transfer Family for FTPが利用するIAMロールの作成
④カスタムIDプロバイダーで利用するLambdaの作成
⑤Secret Managerにユーザー情報を設定 ⑥AWS Transfer Family for FTPの作成
⑦動作確認
※本手順は、前提としてVPCとサブネットを作成している必要があります。

①AWS Transfer Family for FTP用Security Groupの作成

以下と同様な設定でSecurity Groupを作成します。ソースは環境に合わせたCIDRを設定します。

②S3へアクセスできるAMポリシーの作成

S3へアクセスできるAMポリシーの作成します。ポリシー例は以下の通りです。

ポリシー例

your-bucket-nameの個所をアクセスしたいS3バケット名に変更すれば利用できます。 このポリシーは、指定したS3バケットへのフルアクセス権限を付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::your-bucket-name",
                "arn:aws:s3:::your-bucket-name/*"
            ]
        },
        {
            "Effect": "Deny",
            "Action": [
                "s3:DeleteBucket",
                "s3:CreateBucket"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

③AWS Transfer Family for FTPが利用するIAMロールの作成

カスタム信頼ポリシーには、以下の設定を行い、ポリシーには②で作成したポリシーをアタッチしてIAMロールを作成します。

カスタム信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "transfer.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

④カスタムIDプロバイダーで利用するLambdaの作成

AWSが公式で提供しているサンプルテンプレートを利用してLambdaを作成します。

https://s3.amazonaws.com/aws-transfer-resources/custom-idp-templates/aws-transfer-custom-idp-secrets-manager-lambda.template.yml

ダウンロードしたテンプレートを使い、CloudFormationでスタックを作成します。

  • スタックの名前: 任意
  • CreateServer: false
  • SecretsManagerRegion: ap-northeast-1

スタックの実行が完了後、リソースを確認し作成されたLambdaの名前を確認しておきます。(AWS Transfer Familyのサーバ構築時に利用します。)

⑤Secret Managerにユーザー情報を設定

新しいシークレットを保存するを押下します。

「Role: ③で作成したIAMロールのARN」と「Password:パスワード」と「HomeDirectory:ホームディレクトリ」を設定します。

※HomeDirectoryは任意です。また、今回設定したキー以外にも設定できる値があるため、必要に応じて「有効な Lambda 値」をご確認ください。

カスタム ID プロバイダーの使用 - AWS Transfer Family

シークレットの名前を「SFTP/ユーザー名」で設定します。

  • 補足
    FTPなのにSFTPを頭に付与しているのは、Lambdaのコードに関係しています。 気になる場合は、Lambdaの28行目のSFTP/の部分を更新すれば、変更することが可能です。

◆Lambdaの28行目

    resp = get_secret("SFTP/" + input_username)

◆FTP/にしたい場合

    resp = get_secret("FTP/" + input_username)

あとはデフォルトの設定でシークレットを保存します。保存が完了すれば以下のように見えるかと思います。

⑥AWS Transfer Family for FTPの作成

サーバの作成を押下します。

FTPにチェックを付けます。

カスタムIDプロバイダーを選択し、④で作成したLambdaを指定します。

VPCでホスト、内部にチェックを付け、サーバを構築するVPC/サブネットを指定します。

①で作成したセキュリティグループを指定します。

Amazon S3にチェックを付けます。

「追加の詳細を設定」はデフォルトのまま次へを押下します。

サマリを作成後、「サーバを作成」を押下します。

⑦動作確認(AWS Transfer Family for FTP)

※この確認では、Lambdaからのレスポンスを確認できる程度なため、正しく動くかの確認は実際にFTPで接続できること(⑧動作確認(EC2))を確認する必要があります。

サーバの構築が完了したら、アクションからテストを実行します。

必要な情報を入力後、テストを実行します。

以下のような応答があればOKです。

{
    "Response": "{\"HomeDirectoryType\":\"PATH\",\"Role\":\"arn:aws:iam::123456789012:role/s3-access\",\"UserName\":\"fukushima\",\"IdentityProviderType\":\"AWS_LAMBDA\"}",
    "StatusCode": 200,
    "Message": ""
}

⑧動作確認(EC2)

エンドポイントのタイプを押下します。

DNS 名をコピーします。

EC2からAWS Transfer family for FTP経由でS3にアクセス

FTPで接続

# ftp vpce-0e319bd77dcf97064-24u5xpnn.vpce-svc-00411f3b247a08831.ap-northeast-1.vpce.amazonaws.com
Trying 10.88.11.92...
Connected to vpce-0e319bd77dcf97064-24u5xpnn.vpce-svc-00411f3b247a08831.ap-northeast-1.vpce.amazonaws.com (10.88.11.92).
220 Service ready for new user.
Name (vpce-0e319bd77dcf97064-24u5xpnn.vpce-svc-00411f3b247a08831.ap-northeast-1.vpce.amazonaws.com:root): fukushima 【ユーザー名の入力】
331 User name okay, need password for fukushima.
Password:【パスワードの入力】
230 User logged in, proceed.
Remote system type is UNIX.

ファイルのダウロード

## S3にあるファイルを確認
ftp> ls 
227 Entering Passive Mode (10,88,11,92,32,7)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -            0 Sep  7 10:55 s3.txt
226 Closing data connection.

## バイナリモードに変更
ftp> bin 
200 Command TYPE okay.

## ファイルのダウンロード
ftp> get s3.txt 
local: s3.txt remote: s3.txt
227 Entering Passive Mode (10,88,11,92,32,1)
150 File status okay; about to open data connection.
226 Transfer complete.

ファイルのアップロード

## S3にあるファイルを確認
ftp> ls 
227 Entering Passive Mode (10,88,11,92,32,7)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -            0 Sep  7 10:55 s3.txt
226 Closing data connection.

## バイナリモードに変更
ftp> bin 
200 Command TYPE okay.

## ファイルのアップロード
ftp> put ec2.txt 
local: ec2.txt remote: ec2.txt
227 Entering Passive Mode (10,88,11,92,32,3)
150 File status okay; about to open data connection.
226 Transfer complete.

## S3にあるファイルを確認
ftp> ls
227 Entering Passive Mode (10,88,11,92,32,0)
150 File status okay; about to open data connection.
-rwxr--r--   1 - -            0 Sep  7 10:55 ec2.txt 【ファイルがアップロードされている】
-rwxr--r--   1 - -            0 Sep  7 10:55 s3.txt
226 Closing data connection.
ftp> 

FTPの終了

ftp> exit
221 Goodbye.

エンドポイントの名前解決ができない場合

以下に記載の通り、エンドポイントにアタッチされたIPは静的なため、 FTPを行いたいサーバが名前解決できない場合は、IPアドレスで接続することも可能なようです。

ただし、IPアドレスで接続した場合、可用性が損なわれるため、できる限りエンドポイントで接続することが推奨です。

参考: AWS Transfer Family サーバーのエンドポイントタイプを選択する

終わりに

今回は、AWS Transfer Family for FTP + カスタムIDプロバイダー(Lambda,Secret Manager)の構成でS3へアクセスする方法をブログに記載いたしました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。