【AWS】AWS Transfer FamilyでEFSにパスワード認証で接続する

AWS Transfer Familyのパスワード認証の設定で、S3への接続設定の記事は結構あったが、EFSの方があまりなく若干追加で設定しないといけないことがあったので共有します。

1. リソースの作成

まずはパスワード認証に必要なリソース(AWS Transfer Family, API Gateway, Lambda)をAWS公式のCloudFormationのテンプレートから作成します。こちらのリンクからダウンロードしてください。

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

このまま作成するとS3用のAWS Transfer Family(SFTPサーバー)が作成されてしまうので、EFS用に設定するため66行目に1行追記します。

さらにEFS接続の場合はPosixProfileが必要になるため、Lambda関数でPosixProfileをレスポンスに含める記述を315~319行目あたりに以下を追記します。

if 'PosixUserId' in resp_dict and 'PosixGroupId' in resp_dict:
        print("PosixUserId and PosixGroupId found - Applying setting for PosixProfile")
        resp_data['PosixProfile'] = {"Uid": resp_dict['PosixUserId'], "Gid": resp_dict['PosixGroupId']}
else:
        print("PosixUserId or PosixGroupId not found - PosixProfile not set in response")

※PosixProfile(PosixUser, PosixGroup)が何なのかに興味がある方はこちら→https://dev.classmethod.jp/articles/efs-accesspoint-option-settings/


あとは更新したテンプレートでCloudFormationを実行し、リソースを作成するだけです。CloudFormationの具体的な操作方法が必要な方は以下の記事の「1.2. CloudFormationテンプレートの実行編」を参照ください。

https://dev.classmethod.jp/articles/aws-transfer-family-sftp-with-password-method/

2. AWS Transfer Family(SFTPサーバー)の接続ユーザーにEFSへの接続権限を付与

AWS Transfer Familyのマネジメントコンソールへログインし、「1」で作成されたサーバーの画面を開き、「IDプロバイダー」のセクションにある「呼び出しロール」のリンクを押下。 許可ポリシーの「許可を追加」で「AmazonElasticFileSystemFullAccess」権限を追加します(ここではいったんフル権限で設定しますが、必要に応じて最小権限のカスタマー管理ポリシーを作成・設定ください)。

3. 認証用のID/パスワードを作成

あとはAWS Transfer Family(SFTPサーバー)に接続するユーザー情報を、Secrets Managerに登録するだけです。Secrets Managerのコンソール画面から「新しいシークレットを保存する」ボタンを押下し、シークレットのタイプで「そのほかのシークレットタイプ」を選択、「キー/値のペア」のセクションで以下のペアを登録します。

  • Password:SFTPサーバーログイン時のパスワードを入力します
  • Role:「2」のロールのARNを指定します
  • HomeDirectory:EFSへログインした時の初期ディレクトリを指定します
  • PosixUserId:任意のPosix User IDを指定します
  • PosixGroupId:任意のPosix Group IDを指定します

次のページでSFTPログイン時のユーザー名となる「シークレットの名前」を登録しますが、必ず「SFTP/」を最初に記述してから任意のユーザー名を記載してください(Lambda側で「SFTP/」で認識する仕様になっているため)。SFTPサーバーへログインする時はこの「SFTP/」以後のユーザー名で実行することになります。

4. SFTPサーバーに接続

これで準備は整ったので、SFTPサーバー経由でEFSに接続します。コマンドラインでも可能ですが、今回はWinSCPでログインしてみます。

  • ホスト名:AWS Transfer Familyの対象のサーバーの「エンドポイント」を入力
  • ユーザー名:「3」で登録した「シークレットの名前」の「SFTP/」以後のユーザー名を入力
  • パスワード:「3」で登録した「キー/値のペア」の「Password」で登録した値を入力

無事ログインできたでしょうか?うまくいかない場合はAWS Transfer Familyのサーバーの画面で以下「テスト」の機能があり、そこでエラーメッセージが確認できるため見てみてください。

以上、どなたかのお役に立てられれば幸いです。Good Luck!