Briswell Tech Blog

ブリスウェルのテックブログです

AWS Transfer FamilyでのSFTP環境を構築してみました

みな様こんにちは。
BriswellのSonと申します。

最近、帳票や画像などのファイルを読む・保存するために、SFTPサーバーの設定してみました。

SFTPサーバーは外部ユーザーがアクセスできるので、承認されていないものが公開されることを避けるために、適切な権限を与える必要があります。

AWSクラウドではSFTPサーバーを簡易的に管理するために、[Transfer Family]というサービスを提供しています。

添付した画像を参照すれば、大体な流れがわかると思いますが、詳しい設定方法を追記します。

I. S3バケットの作成

ファイルを保存するため、S3バケットを1つ作成する必要があります。
バケット名を bw-test-transferfamily と設定します。

上記の画像により、バケットの作成が完了しました。

II. Transfer Familyの作成

①. ポリシーの作成
ユーザーを認証するために、最初にIAMサービス側でポリシーを作成しないといけないです。
作成方法は下記の通りです。

[アクセス許可を指定] 画面で [ポリシーエディタ] 項目でJSONを選び、下記のルール内容を入力する。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::bw-test-transferfamily"
            ],
            "Effect": "Allow",
            "Sid": "CommonS3Role"
        },
        {
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:DeleteObjectVersion",
                "s3:GetObjectVersion",
                "s3:GetObjectACL",
                "s3:PutObjectACL"
            ],
            "Resource": [
                "arn:aws:s3:::bw-test-transferfamily/*"
            ],
            "Effect": "Allow",
            "Sid": "ReadWriteS3Role"
        }
    ]
}

次の画面は [確認して作成] です。
[ポリシー名] 項目で bw-user-transferfamily-policy を入力し、[ポリシーの作成] ボタンを押下する。

上記の画像により、ポリシーの作成が完了しました。

②. [Transfer Family] のユーザーのロール作成
ユーザーのアクションを管理するために、ロールを作成する必要があります。
詳しい作成方法は下記の通りです。

[信頼されたエンティティを選択] 画面では [信頼されたエンティティタイプ] を [AWS のサービス] に選択し、[ユースケース] 項目で [Transfer] を選択します。
選択後、[次へ] ボタンを押下する。

[許可を追加] 画面で bw-user-transferfamily-policy のポリシーを検索する。
Hitしたレコードから該当のレコードにチェックを入れて、[次へ] ボタンをクリックする。

[名前、確認、および作成] 画面では、[ロール名] で bw-user-transferfamily-role と入力する。
入力後、[ロールを作成] ボタンをクリックする。

上記の画像により、ロールの作成が完了しました。

③. [Transfer Family] 作成
最初に [AWS Transfer Family] 画面で [サーバーを作成] ボタンを押下します。
押下後、[プロトコルを選択] 画面に移動します。

SFTPメソッドでバケットへファイルをアップロードしたいので、[SFTP (SSH ファイル転送プロトコル) - Secure Shell 経由のファイル転送] を選択し、[次へ] ボタンをクリックする。

[ID プロバイダーを選択] 画面で [サービスマネージド] を選択します。
選択後、[次へ] ボタンを押下する。

[エンドポイントを選択] 画面でパブリックでアクセスしたいので、[パブリックアクセス可能] を選択します。
選択後、[カスタムホスト名]は [なし] に選択してもいいです。[次へ] ボタンを押下する。

[ドメインを選択] 画面でS3へ接続したいので、[Amazon S3] を選択します。
選択後、[次へ] ボタンを押下する。

[追加の詳細を設定] 画面でデフォルトのままにして、[次へ] ボタンを押下します。

確認と作成の画面で詳細な設定を確認し、OKだった場合、[作成] ボタンをクリックします。
注意:作成したら、1 時間あたり 0.30USDの料金がかかってしまうので、調査だけの場合は終わり次第削除したほうがいいです。

上記の画像により、[Transfer Family] の作成が完了しました。

④. [Transfer Family] のユーザー作成
ユーザーを作成するために、[Transfer Familyサーバー管理] 画面で先程作成したサーバーIDを押下する。
[詳細なサーバー] 画面に移動し、[ユーザー] 設定のグループで [ユーザーを追加] ボタンを押下する。

[ユーザーを追加] 画面で [ユーザー名] 項目を bw-user-transferfamily と入力し、[ロール] 項目で bw-user-transferfamily-role を選択し、ホームディレクトリで bw-test-transferfamily を選びます。

bw-test-transferfamily/csv のフォルダにファイルをアップしたいので、[オプションのフォルダ] 項目で csv を入力し、[制限付き] のチェックを入れます。

最後に追加ボタンを押下する。

上記の画像により、ユーザーの作成が完了しました。

⑤. ユーザーの [SSH パブリックキー] 追加
SSHキーを作成しておくために、自分のパソコンのTerminalで下記のコマンドを実行する。

ssh-keygen -t rsa -C "bw-test-transferfamily" -f ~/.ssh/bw-test-transferfamily
cat ~/.ssh/bw-test-transferfamily.pub
  • ssh-keygen -t rsa -C "bw-test-transferfamily" -f ~/.ssh/bw-test-transferfamily:[プライベートキー] と [パブリックキー] を作成するため。
  • cat ~/.ssh/bw-test-transferfamily.pub:[パブリックキー] 内容を取得し、[Transfer Family] のユーザーのSSHキー設計部分に追加するため。

SSHキー作成方法は下記の画像の通りです。

SSHキーの作成が完了したら、先程作成した [Transfer Family] のユーザーを押下して、[明細ユーザー] 画面に移動します。
[SSH パブリックキー] 設定のグループで [SSH パブリックキーを追加] ボタンを押下する。

[キーを追加] 画面の [SSH パブリックキー] 項目で作成したばかりキー(~/.ssh/bw-test-transferfamily.pubファイル内容)を入力後、[キーを追加] ボタンを押下する。

上記の画像により、SSH パブリックキーの追加が完了しました。

III. テスト

今回S3へファイルをアップロードするために、Cyberduckを使います。
設定方法は下記の画像の通りです。

Connection型が、[SFTP]
Sever: Transfer Familyサーバのエンドポイントを参照
Username: Transfer Familyサーバのユーザー名
SSH Private Key: 自分のパソコンでSSHキーを作成した時に、このファイルを作成しました。

必須項目の入力が完了したら、[Connect] ボタンを押下する。
問題がなければS3の bw-test-transferfamily/csvにあるファイルが表示されます。

上記の画像により、CyberduckアプリでS3へファイルをアップロードできました。

最後に

今回は、CyberduckなどからS3にSFTPの方法でアップロードするために、SFTPサーバの構成について共有しました。
最後まで読んでいただきありがとうございました。
疑問があれば、コメントをしてください。