現代のテクノロジーの世界では、多くの組織にとって安全かつ効率的なファイル転送が不可欠です。アマゾン ウェブ サービスが提供するマネージド型の安全なファイル転送ソリューションである AWS Transfer Family では、SFTP、FTPS、FTP、AS2 などの標準プロトコルを使用したファイル転送が可能です。効率性と使いやすさで知られるプログラミング言語 Golang と組み合わせると、ファイル転送を効果的に管理および自動化するための強力な組み合わせが作成されます。
この記事では、AWS Transfer Family を Golang と統合してファイル転送プロセスを最適化する方法について説明します。 AWS Transfer Family の設定から Golang を使用した SFTP クライアントの実装まで、これらのテクノロジーを最大限に活用できるようにステップバイステップでガイドします。
AWS Transfer Family とは何ですか?
AWS Transfer Family は、SFTP、AS2、FTPS、FTP などのプロトコルを使用して、Amazon S3 や Amazon EFS などの AWS ストレージ サービスとの間でファイルを転送できる、安全なフルマネージド サービスです。
主な特長
- サポートされているプロトコル: SFTP、FTPS、FTP、AS2
- AWS ストレージの統合: Amazon S3、Amazon EFS
- ユースケース: データレイク、内部転送、データ分散、コンプライアンスワークフロー、サプライチェーンロジスティクス、B2B トランザクション。
利点
- リアルタイムのスケーラビリティ。
- インフラストラクチャ管理は必要ありません。
- データ処理と分析にネイティブ AWS サービスを活用します。
- フルマネージドのサーバーレス ワークフロー サービス。
- 従量課金制の料金設定。
前提条件
- AWS アカウント: アクティブなアマゾン ウェブ サービス アカウント。まだお持ちでない場合は、AWS ウェブサイトでサインアップできます。
- Golang: Go (Golang) プログラミング言語に関する知識。
- AWS の管理者権限。
- AWS Transfer Family: AWS Transfer Family を設定および管理するための管理読み取りおよび書き込み権限。これには、転送サーバーを作成および管理する機能が含まれます。このサービスには関連費用がかかることに注意してください。
- Amazon S3: Amazon S3 バケットの読み取りおよび書き込みを行う管理権限。
- AWS IAM: 転送の統合とセキュリティに必要な IAM ロールとポリシーを管理する権限。
建築設計
AWS Transfer Family を Golang と統合するために提案されたアーキテクチャ設計は、以下の図に示すように、次のコンポーネントで構成されます。

この記事で提案されている API は、その基本的な機能を示す基本的な例として機能します。実際のシナリオでは、API はより複雑になり、追加機能が含まれる場合があります。その主な機能は、バックアップ目的であっても、他のシステムとの統合であっても、ファイルを AWS Transfer Family SFTP サーバーにアップロードし、S3 バケットに保存することです。ユースケースはさまざまで、各組織のニーズによって異なります。追加の使用例は次のとおりです: AWS Transfer Family の顧客
さらに、この記事で提案されている API は、AWS Elastic Beanstalk や AWS Fargate などのサービスを使用して AWS クラウドにデプロイされ、各組織の特定の要件に応じて、より優れたスケーラビリティと可用性を実現できます。
始めましょう!
実装
公開鍵と秘密鍵を生成する
AWS Transfer Family SFTP サーバーに接続するための公開キーと秘密キーのペアを生成します。これは、次のコマンドを使用してマシン上でローカルに実行できます。
$ ssh-keygen -t rsa -b 4096 -f /aws_example_ssh_key
- aws_example_ssh_key: キー名
- PATH: キーが保存されるディレクトリ
- rsa: 暗号化アルゴリズム
- 4096: キーサイズ
- f: 出力ファイル名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ssh-keygen -t rsa -b 4096 -f <PATH>/aws_example_ssh_key
Generating public / private rsa key pair.
Enter passphrase ( empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in <PATH>/aws_example_ssh_key
Your public key has been saved in <PATH>/aws_example_ssh_key.pub
The key fingerprint is:
SHA256:P80TXbp10tjdzJLc3KAhtWP9YWQe+A181WvqUQyaTFc rodrigoquispe@0WJMD6M
The key's randomart image is:
+---[RSA 4096]----+
| ..oE+|
| o ** +|
| + O **+|
| * *.^*|
| S o % #|
| . o + =.|
| o = o |
| . o |
| |
+----[SHA256]-----+
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
- パスフレーズを入力してください (パスフレーズがない場合は空白): キーのパスワード。
- 同じパスフレーズを再度入力します: キーのパスワードを確認します。
- あなたの ID は /aws_example_ssh_key に保存されました: 秘密キーは、指定されたパスの aws_example_ssh_key ファイルに保存されます。
- 公開キーは /aws_example_ssh_key.pub に保存されました: 公開キーは、指定されたパスの aws_example_ssh_key.pub ファイルに保存されます。

Transfer Family サービスの作成
AWS マネジメントコンソールにログインし、AWS Transfer Family サービスを選択してサーバーを作成します。

安全なファイル転送のために SFTP (SSH ファイル転送プロトコル) を選択し、[次へ] をクリックします。

ID プロバイダーを選択し、[管理対象サービス] を選択します。

エンドポイント構成で、「パブリックにアクセス可能」を選択し、「次へ」をクリックします。

ストレージ オプションとして「Amazon S3」を選択し、[次へ] をクリックします。

「追加の詳細の構成」セクションでは、設定をデフォルト値のままにします。




内容を確認し、「次へ」をクリックして作成します。
作成が完了すると、次のようなものが得られます。まだユーザーがいないことがわかり、パブリック エンドポイントを介して S3 をストレージとして使用して間もなく開始されることがわかります。

ロールを作成する
AWS 転送ファミリーから s3 サービス用の新しいロールを作成します。これを行うには、IAM サービスに移動し、AWS サービス タイプの新しいロールを作成し、ユースケースで [転送して次へ] を選択します。

S3 バケットへのフルアクセスを許可するアクセス許可ポリシー、AmazonS3FullAccess。ただし、このポリシーは非常に許容されるものであり、運用環境での使用はお勧めできません。そして次です。

ロールの名前「role-example-transfer-to-s3」の割り当てに進み、確認して「ロールの作成」をクリックします。

S3バケットの作成
s3 バケットの作成に進みます。これを行うには、s3 サービスに移動して新しいバケットを作成します。

デフォルト設定のままでバケットの名前を設定し、バケットを作成します。
バケット名: "bucket-example-transfer"。


作成の最後には次のようなものになります:

S3 を使用した Transfer Family の SFTP ユーザーの構成
AWS Transfer Family サービスに移動し、前に作成したサーバーを選択します。
- 「ユーザー」タブを選択し、「ユーザーを追加」をクリックします。
- ユーザー名を入力してください。
- 前に作成した IAM ロールを割り当てます。
- 「ポリシー」をなしに設定します
- 「ホーム ディレクトリ」フィールドに、bucket-example-transfer と入力します。これは、前に作成した S3 バケットの名前です。
- 「ユーザーを追加」をクリックします。

この記事に従うには、aws_example_ssh_key.pub の開始時に生成された公開キーを提供する必要があります。
公開キーの内容を表示するには、次のコマンドを使用します:
$ cat aws_example_ssh_key.pub
公開鍵は次のようになります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ssh-keygen -t rsa -b 4096 -f <PATH>/aws_example_ssh_key
Generating public / private rsa key pair.
Enter passphrase ( empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in <PATH>/aws_example_ssh_key
Your public key has been saved in <PATH>/aws_example_ssh_key.pub
The key fingerprint is:
SHA256:P80TXbp10tjdzJLc3KAhtWP9YWQe+A181WvqUQyaTFc rodrigoquispe@0WJMD6M
The key's randomart image is:
+---[RSA 4096]----+
| ..oE+|
| o ** +|
| + O **+|
| * *.^*|
| S o % #|
| . o + =.|
| o = o |
| . o |
| |
+----[SHA256]-----+
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これは、「SSH 公開キー」フィールドに含める必要があるキーです。サーバーへの安全なアクセスを可能にするために、キー全体をコピーしてこのフィールドに正確に貼り付けてください。

ユーザーを作成すると、以下のような確認画面が表示されます。これは、ユーザーが正常にセットアップされ、SFTP サービスを使用する準備ができていることを示します。

プロジェクトの構造
以下では、Golang プロジェクト構造の詳細な概要を示し、参照用に GitHub リポジトリへのリンクを示します。この概要は、プロジェクトの構成と、さまざまなコンポーネントがどのように構造化され相互接続されているかを理解するのに役立ちます。
1 | ssh-rsa AAAAB3NzaC1yc2EBBAADAQABAAACAQC/qNMJaCz8+I3G71bTFf8Cpe+AAAA0BBBBBBBA6C+/a8fyl9Dw4wjj0huc4ItlX2auKG3skxTYP1ZgO5/7M7xmp2Hf+AAAA0BBBBBBBA6CynWwfwkS5XEIfNtoNWCSeB6ra4anljFdLJH4ZReOM18xxBZCyz2gGA7ePprM0nfpgoQKjp8eDoz6HFcvH4Qynea06W72D+tUWjCRH6bgPBsw/cCfj+VrcqsQXif/X8nViS679+V+AAAA0BBBBBBBA6C+t/5dD3uFPyc8yJn2fNEHB4kfIB9JR5fPIo4dVqPebloPg9vKT2M+AAAA0BBBBBBBA6C/AAAA0BBBBBBBA6C+XLTJSAljgq9JQ4l3vnT4RSsKuK+DX2um5DsN/Zwk9Qwf8JRJey/AAAA0BBBBBBBA6C+/AAAA0BBBBBBBA6CNkVaeDOYSIeGkMBUmmMaeVNeaR967SBLoHNzBfodKKaIpsmW2yHvIitg/YKu2YXKe/DnYU3G8om13uL8qIOB85CugVQ== rodrigoquispe@AAAA0BBBBBBBA6C
|
ログイン後にコピー
使用する依存関係は、Gin と SFTP です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ├── cmd
│ └── main.go
├── go.mod
├── go.sum
└── internal
├── app
│ └── service.go
├── domain
│ └── models.go
├── handler
│ └── sftp_handler.go
└── infra
├── config.go
└── sftp_client.go
|
ログイン後にコピー
SFTP サーバーに接続するには、秘密キーと Transfer Family ユーザーの資格情報が配置されている config.go ファイルに次の資格情報を設定します。
1 2 | $ go get -u github.com/gin-gonic/gin
$ go get -u github.com/pkg/sftp
|
ログイン後にコピー
- ホスト: 前に取得した接続エンドポイント。
- ポート: 22
- ユーザー: 前に作成したユーザー名。
- PrivateKeyPath: 前に作成した秘密キーへのパス。
SFTP サーバーにアップロードされたファイルが保存されるパスの設定も検討してください。私の場合、/bucket-example-transfer/rodrigo です。
1 2 3 4 5 6 7 8 9 10 | func LoadConfig() *Config {
return &Config{
Host: "<HOST>.server.transfer.us-east-1.amazonaws.com" ,
Port: "<PORT>" ,
User: "<USER>" ,
PrivateKeyPath: "<PATH>/aws_example_ssh_key" ,
}
}
|
ログイン後にコピー
指定された構成で新しい SFTP クライアントを作成する関数:
1 2 3 4 5 | func (u *Service) Upload(file *domain.File) error {
return u.sftpClient.UploadFile(file, "/bucket-example-transfer/rodrigo/" )
}
|
ログイン後にコピー
SFTP サーバーにファイルをアップロードするメソッド。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ssh-keygen -t rsa -b 4096 -f <PATH>/aws_example_ssh_key
Generating public / private rsa key pair.
Enter passphrase ( empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in <PATH>/aws_example_ssh_key
Your public key has been saved in <PATH>/aws_example_ssh_key.pub
The key fingerprint is:
SHA256:P80TXbp10tjdzJLc3KAhtWP9YWQe+A181WvqUQyaTFc rodrigoquispe@0WJMD6M
The key's randomart image is:
+---[RSA 4096]----+
| ..oE+|
| o ** +|
| + O **+|
| * *.^*|
| S o % #|
| . o + =.|
| o = o |
| . o |
| |
+----[SHA256]-----+
|
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次のコマンドを使用してプロジェクトを実行します:
$ go run cmd/main.go

次に、Postman を使用してファイルを SFTP サーバーにアップロードします。次に、S3 に移動して、ファイルが正しくアップロードされたことを確認します。


ファイルは問題なくアップロードされました。
お読みいただきありがとうございます。
以上がファイル転送用の Golang を使用した AWS Transfer Familyの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。