こんにちは。AWS CLIが好きな福島です。
- はじめに
- 参考
- 概要図
- 流れ
- ①AWS Transfer Family for FTP用Security Groupの作成
- ②S3へアクセスできるAMポリシーの作成
- ③AWS Transfer Family for FTPが利用するIAMロールの作成
- ④カスタムIDプロバイダーで利用するLambdaの作成
- ⑤Secret Managerにユーザー情報を設定
- ⑥AWS Transfer Family for FTPの作成
- ⑦動作確認(AWS Transfer Family for FTP)
- ⑧動作確認(EC2)
- エンドポイントの名前解決ができない場合
- 終わりに
はじめに
今回は、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を作成します。
ダウンロードしたテンプレートを使い、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へアクセスする方法をブログに記載いたしました。 どなたかのお役に立てれば幸いです。