[アップデート]Transfer for SFTP が PrivateLink に対応したので、アカウント間のファイル共有に使ってみる

AWS Transfer for SFTP が PrivateLink に対応しました!今回はこのアップデートを使って、AWS アカウント間でプライベートにファイル共有する SFTP 構成を検討しましたのでご紹介します!
2019.03.31

先日、AWS Transfer for SFTP の PrivateLink 対応が発表されました。これまではパブリックエンドポイントとしての利用のみでしたが、PrivateLink 対応によって、VPC 内はもちろんのこと、DirectConnect/VPN 経由のプライベートネットワークでも SFTP エンドポイントを利用することが出来るようになりました。

以前、「AWS アカウント間でのファイル共有に Transfer for SFTP を使いたい」という相談をいただいたのですが、IPアドレスでの制限が出来ないために断念したことがありました。

今回のアップデートによって、Internal NLB の PrivateLink と組み合わせることで、AWS アカウント間でフルマネージドな SFTP エンドポイントが実現できそうだったので試してみました。構成図は下記のようになります。

VPC ピアリングでも良いのですが、必要最低限のネットワーク接続に限定したい場面を想定し、PrivateLink でのアカウント間接続を選択しました。

Transfer for SFTP 用の VPCエンドポイント作成

Transfer for SFTP に使用する VPC エンドポイントおよび、VPC エンドポイントのセキュリティグループを作成します。

セキュリティグループは、 Internal NLB を配置するサブネットからの SSH(22) を許可しています。

それでは VPC ダッシュボード から Endpoints - Create Endpoint でエンドポイントを作成していきます。サービスカテゴリは AWS services を指定し、サービス名の一覧から com.amazonaws.ap-northeast-1.transfer.server を選択します。

次に VPC とサブネットを選択します。

DNS 設定、セキュリティグループを選択し、Create endpoint をクリックします。

VPC エンドポイントが作成できましたら、Subnet タブから VPC エンドポイントに割り当てられたプライベート IP アドレスを確認します。後ほど、Internal NLB のターゲット指定に使用します。

Transfer for SFTP 用の VPCエンドポイント作成は以上です。

Transfer for SFTP の作成

次に、Transfer for SFTP を作成していきます。Transfer for SFTP ダッシュボードから Create server をクリックします。今回のアップデートによって、Endpoint configuration で publicVPC を選択できるようになっていました。VPC を選択すると、 VPC endpoint の項目が表示されますので、先ほど作成した VPC エンドポイントを指定します。

Identity provider、Loging role、Tags はデフォルトのまま、Create server をクリックします。 サーバーが作成されましたら、一覧から対象の Server ID をクリックし、ユーザを作成します。ユーザ作成については割愛しますので、以下のエントリーを参考にしてください。

AWS SFTPでホームディレクトリの読み書きだけ許可してみた #reinvent

Internal NLB 作成

次に、Internal NLB を作成しますが、詳細な手順は割愛します。以下のような設定で作成しました。

  • ロードバランサー
  • Internal NLB
  • リスナーポート: 22
  • リスナープロトコル: TCP
  • ターゲットグループ
  • ポート: 22
  • ターゲットタイプ: ip
  • ターゲット
  • 先ほど作成した Transfer for SFTP 用の VPC エンドポイントの IP を指定

VPC エンドポイントサービス作成

次に、アカウントA から PrivateLink を作成するために、VPC エンドポイントサービスを作成します。VPC ダッシュボード から Endpoint Services - Create Endpoint Services を開きます。先ほど作成した、 Internal NLB を指定。VPC エンドポイントサービスへの接続は承認を必要としたいので、Require acceptance for endpoint を有効にしています。

VPC エンドポイントサービスが作成できたら、Whitelisted principals タブを開き、Add principals to whitelist から、許可する AWS アカウントもしくは IAM ユーザ、IAM ロールを登録します。今回はアカウントで許可するので、arn:aws:iam::aws-account-id:root を追加しました。

それでは、アカウントAから先ほど作成したアカウントBの VPC エンドポイントサービスに PrivateLink を作成します。VPC ダッシュボード から Endpoint - Create Endpoint を開きます。Find service by name を選択し、アカウントBの VPC エンドポイントサービスを指定します。

あとは VPC、サブネット、およびセキュリティグループを指定し、Create endpoint を作成します。セキュリティグループは、SSH(22) を許可しています。

アカウントBで接続の承認

先の手順で、アカウントAから VPC エンドポイントサービスへの接続申請を行いましたので、アカウントBで接続承認を行います。VPC エンドポイントサービスの Endpoint Connections タブを開き、申請されている Endopoit ID を選択、Actions から Accept endpoint connection requies をクリックします。

Status が Available になりましたら準備完了です!

アカウントAから接続テスト

アカウントA内の SFTP クライアントから、アカウントAの VPC エンドポイントを指定してアクセスしてみます。

$ dig vpce-xxxxxxxxxx-xxxxxx.vpce-svc-xxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com +short
172.31.3.232 ←アカウントAのプライベートIP
172.31.0.189 ←アカウントAのプライベートIP

sftpupload.txt ファイルをアップロードしてみます。

アカウントBの SFTP ターゲットの S3 バケットを確認してます。

Internal NLB と PrivateLink を使って、AWS アカウント間のファイル共有に Transfer for SFTP が使えることが確認できました!

2019.6.26 追記 NACL を使うことでパブリックアクセスを特定 IP に限定できる方法がありましたので、訂正記事を投稿しました。

「AWS Transfer for SFTP のパブリックアクセスを特定 IP に限定する方法」

今回は AWS アカウント間のプライベート環境でしたが、Internet facing な NLB で 特定 IP のみを許可することが来るでしょうか?

結論としては、フルマネージドサービスのみでは、現状は出来ません。理由としては、以下の2点です。

  • NLB はセキュリティグループを設定できない
  • ターゲットタイプ ip の場合、Source IP は NLB になる

このため、VPC Endpoint 側でパブリック SFTP クライアントの IP アドレスで制御することは出来ないと思われます。

PrivateLink の前段に、EC2 インスタンスのプロキシなどを配置すれば可能です。ただし、フルマネージドな SFTP サーバを使うために、ユーザマネージドなサーバを追加することになるので、何を目的とするのかは要検討ください。

さいごに

アカウント間でのプライベートなファイル共有としては、単純に S3 バケットと VPC エンドポイントで実現することは可能ですが、パッケージ製品であったりプログラム改修の手間から、既存で使える SFTP でやりたい、という場合には今回のような構成が使えるかと思います!

つい先日、「出来ないですね、、、」と断念したことが、アップデートによって実現できるようになる。これぞ AWS のスピード感やで!!というのを改めて感じました。

以上!大阪オフィスの丸毛(@marumo1981)でした!