🦔

【AWS/TransferFamilly For SFTP】初心者が構築した備忘録

に公開

どうも!前歯すきっ歯です🦷

サーバのconfigをTransferFamily for SFTP経由でS3へ格納する案件に関わるので、
その予習として今回はタイトルの勉強をしました!

0.本記事について

0-1.💪勉強のゴール💪

今回のゴールは以下2点です。
▼ゴール詳細---------------------------------------------------------------------------

  1. 以下構成図の環境を作成する。
  2. EC2でSFTPのコマンドを実行して、TransferFmailly経由でS3へファイルを送信する

    最終構成図

0-2.前提条件

以下3点を前提条件とします。

▼前提条件---------------------------------------------------------------------------

  1. 後述する手順開始時点の各PCやサーバの配置は以下構成図の通りです。以下項目が構築済みとします。
    ・NW周り(VPC、サブネット、ルートテーブル)
    ・EC2(OS:AmazonLinux2023)はデプロイ済み
  2. ルーティングやEC2のセキュリティグループ等クラウド上の通信に必要な設定は完了しており、AWS内の通信には問題がない想定とします。
  3. クライアントサーバ側(=EC2)の設定はSSHキーペアの作成まで終了している想定とします。

    開始時構成図

0-3.本記事のあらすじ

以下がTransferFamily for SFTPを構築する本記事の流れです。
▼流れ---------------------------------------------------------------------------------

  1. SFTPクライアントから送信したファイルを格納するS3のバケットを作成
  2. VPCエンドポイントにアタッチするセキュリティグループを作成
  3. TransferFamily内に作成するユーザーに付与するIAMロールを作成
  4. TransferFamily for SFTPを作成
  5. TransferFamily内ユーザー(=SFTP接続時にログインされるユーザー)を作成
  6. クライアントサーバ(=EC2)からTransferFamilyへSFTP接続してファイルを送信

1.クライアントサーバから送信したファイルを格納するS3のバケットを作成

1-1.S3の前提知識

S3での設定項目について網羅的に記載されています。後述の設定項目で分からない部分があればこのリンク先を参照ください。記事内はAWS公式のリンクが多く(全て?)なので大変助かります。
▼リンク---------------------------------------------------------------------------------

1-2.S3バケットの作成

  1. S3コンソール内[汎用バケット]タブから[バケットを作成]を選択する。
  2. S3にバケット名を入力し、[バケットを作成]を選択する。バケット名をtransfer-studyとする。
    ※今回はデータを入れるだけなのでデフォルト以外の設定は行いません。
  3. S3が正常に作成されたことを確認する。

2.VPCエンドポイントにアタッチするセキュリティグループを作成

2-1.セキュリティグループを作成する

  1. EC2コンソール内[セキュリティグループ]タブの[セキュリティグループを作成]を選択する。
  2. セキュリティグループでSSH22番ポートの許可を設定して、画面右下[セキュリティグループを作成]を選択する。セキュリティグループはTransfer-EP-SGとする。
  1. セキュリティグループが正常に作成されたことを確認する。

3.TransferFamily内に作成するユーザーに付与するIAMロールを作成

3-1.IAMロールの前提知識

3-1-1.IAMロールの記述方法

初心者だと「IAMロールは雰囲気で読めるけど、ちゃんと読めと言われると…」みたいな感じではないでしょうか?(自分がそうでした) IAMロール作成、付与しないとTransferFamilyを使用できないので、これを機にIAMロールを読めるように一緒に勉強しましょう~~~
▼リンク---------------------------------------------------------------------------------

3-1-2.AssumeRoleについて

この後の[3-2]でTransferFamillyのAsuumeRoleの使われ方を解説するので、ここでは個人的に読みやすかったAssumeRoleのネット記事を置いておきます。
▼リンク---------------------------------------------------------------------------------

3-2.TransferFamillyにおけるAssumeRoleの使われ方

AssumeRoleって、結局どう使われているのか目に見えないし、ネット調べても自分の知りたいことに置き換えて読むことができないものが多いし、理解するのが難しいですよね…。わかります。今から解説していきます!

3-2-1.登場人物の紹介

▼登場人物---------------------------------------------------------------------------------

▼それぞれの関係性--------------------------------------------------------------------------

3-2-2.TransferFamillyがAssumeRoleする流れ

  1. まずec2-userがTransferFamillyにsftpuserとしてsftp接続をします。
  2. Transferの心の声が聞こえてきます。
  3. TransferがRoleAを引き受けよう(Assume)とする。
  4. STSがPolicyB(信頼ポリシー)に「TransferがRoleAを引き受ける許可」があるか確認する。
  5. STSがTranferに一時トークンを発行する。
  6. 一時トークンの許可によりPolicyA記載のS3のアップロードが可能になる。

3-3.IAMポリシーの作成(アイデンティティポリシー/sftpuserがS3を使える許可)

  1. IAMコンソール内[ポリシー]タブの[ポリシーの作成]を選択する。
  2. ポリシーエディタで[json]を選択する。
  3. 以下アイデンティティポリシーのJSONをポリシーエディタにコピペする。
    transfer-studyの部分には、1-2で作成したS3のバケット名が入ります。
アイデンティティポリシー/sftpuserがS3を使える許可
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"s3:ListBucket",
				"s3:GetBucketLocation"
			],
			"Effect": "Allow",
			"Resource": [
				"arn:aws:s3:::transfer-study"
			]
		},
		{
			"Effect": "Allow",
			"Action": [
				"s3:PutObject",
				"s3:GetObject",
				"s3:DeleteObject"
			],
			"Resource": "arn:aws:s3:::transfer-study/*"
		}
	]
}

  1. IAMポリシー名(今回はTransfer-to-S3)を入力して、画面右下[ポリシーの作成]を選択する。
  2. IAMポリシーが作成されたことを確認する。

3-4.信頼ポリシー(AssumeRole)とIAMロールの作成

  1. IAMコンソール内[ロール]タブの[ロールの作成]を選択する。
  2. 信頼されたエンティティタイプで[AWSのサービス]を選択し、ユースケースで[transfer]を選択する。
  1. 3-3で作成したIAMポリシーを検索、選択する。
  2. IAMロールの名前(Transfer-to-S3)を入力し、信頼ポリシーとアイデンティティポリシーの内容を確認する。問題がなければ、画面右下[ロールの作成]を選択します。
  1. IAMロールが作成されたことを確認する。

4.TransferFamily for SFTPを作成

4-1.TransferFamilyの前提知識

TransferFamillyには大きく分けて4つの構成例があります。今回は[S3接続/VPCでホスト&内部向け]を選択しますが、ご自分の環境と照らし合わせどの構成が適切か判断してください。
▼リンク---------------------------------------------------------------------------------

4-2.TransferFamily for SFTPを作成

  1. TransferFamillyのコンソールから[サーバーを作成]を選択する。
  2. 今回はSFTP接続を行うので、[SFTP~のファイル転送]を選択する。
  3. TransferFamilly内にユーザーを新規作成するので、[サービスマネージド]を選択する。
  4. 以下画像の通り選択する。
  1. データをS3へ格納するので[Amazon S3]を選択する。
  2. 以下画像の通り選択する。
  1. 設定内容を確認してTransferFamillyを作成する。
    内容が重複するので以下トグルにまとめます。
設定内容の確認

  1. TransferFamillyが作成できたことを確認して。[ユーザーを作成]を選択。
    ※続きは次の章に記載します。

5.TransferFamily内ユーザー(=SFTP接続時にログインされるユーザー)を作成

5-1.クライアントサーバ側の設定

クライアントサーバ側では公開鍵を作成している前提とします。
自分の記事で恐縮ですが、作成方法に関しては以下記事をご覧ください。
▼リンク---------------------------------------------------------------------------------

5-2.TransferFamily内ユーザー(=SFTP接続時にログインされるユーザー)を作成

  1. 4-2 手順9の続きです。画像のように入力する。ユーザー名はsftpuser、ホームディレクトリをtransfer-study/sftpuserとする。
  1. ユーザーが作成されたことを確認する。

6.クライアントサーバ(=EC2)からTransferFamilyへSFTP接続してファイルを送信

6-1.接続先がTransferFamillyのときの指定方法

TransferFamillyに接続するときは接続先としてVPCエンドポイントのリージョンのDNS名を利用します。

TransferFamillyに接続する時のコマンド
sftp -i [クライアントサーバの秘密鍵] [ログインするユーザー名]@[VPCエンドポイントのリージョンのDNS名]

AWS公式の手順でもリージョンのエンドポイントのDNS名を選択しているようです。

6-2.クライアントサーバからSFTP接続をしてファイル送信する

  1. TransferFamillyの[エンドポイントのタイプ]を選択する。
  2. VPCのコンソールに飛ぶので、チェックボックスを選択する。
  3. 2つあるDNS名のうち上のDNS名(リージョンのDNS名)をコピーする。
  4. クライアントサーバにログインして、sftp接続のコマンドを打ち、ファイルを送信する。
    ※クライアントサーバ側の秘密鍵の名前を/home/ec2-user/.ssh/TransferTest/home/ec2-user配下にtestという名前のファイルがあるとします。
クライアントサーバからTransferFamillyにSFTP接続する
[ec2-user@クライアントサーバ .ssh]$ sftp -i TransferTest sftpuser@[リージョンのDNS名]
Connected to Transfer Familly for SFTP!!!
Connected to [リージョンのDNS名]
sftp>
sftp> put /home/ec2-user/test
Uploading /home/ec2-user/test to /transfer-study/sftpuser/test
test                                100%    5     1.5KB/s   00:00
sftp>
sftp> ^D
[ec2-user@クライアントサーバ .ssh]$
  1. S3のコンソールからファイルが格納されていることを確認する。

6-3.リージョンとAZ どちらのDNSを使って接続すればいいの?

6-3-1.結論とその理由

【結論】リージョンのDNS名を選択します。
▼理由---------------------------------------------------------------------------------

  • リージョンのDNS名が何かしらの理由で使えなくなっても、AZ固有のDNS名を利用できるから。
    その逆に、AZ固有のDNS名を利用していてもリージョンのDNS名に切り替えることはできません。
  • リンク先のように複数AZを利用してTransferFamillyをデプロイしている場合、AZのDNS名を選択すると片方のDNSエンドポイントのみしか利用できなくなってしまうから。

6-3-2.クライアントサーバから2つのDNSにnslookupしてみる

興味本位でnslookupしてみました。以下が実行結果です。どちらのDNS名もちゃんとプライベートサブネット内のNICに結びついているみたいですね!(肝心なところがマスクでごめんなさい)

クライアントサーバからリージョンのDNS名に対してnslookupする
[ec2-user@web01 ~]$ nslookup [リージョンのDNS名]
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	[リージョンのDNS名]
Address: [プライベートサブネットNICのIP]
クライアントサーバからAZ固有のDNS名に対してnslookupする
[ec2-user@web01 ~]$ nslookup [AZ固有のDNS名]
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	[AZ固有のDNS名]
Address:  [プライベートサブネットNICのIP]

7.おわりに

TransferFamillyは自前でSFTPサーバーを立てるよりも高額なので、下記リンクのようにSFTPサーバーをEC2で自作しS3に接続する人もいるようですね~。高額ではありますが、スペックを選ばなくてよかったり、監視等の運用の手間が減る点はPaaSであるTransferFamillyのいいところではありますよね!ご参考までに!

本記事をご覧いただきありがとうございました。
技術的な誤り等あればお気軽にコメントお願いします!

Discussion