在現代科技世界中,安全且有效率的文件傳輸對許多組織來說至關重要。 AWS Transfer Family 是 Amazon Web Services 提供的託管安全文件傳輸解決方案,可使用 SFTP、FTPS、FTP 和 AS2 等標準協定進行檔案傳輸。當與 Golang 這種以其高效和易用性而聞名的程式語言結合使用時,可以創建一個強大的組合來有效地管理和自動化文件傳輸。
在本文中,我們將探討如何將 AWS Transfer Family 與 Golang 整合以最佳化您的檔案傳輸流程。從配置 AWS Transfer Family 到使用 Golang 實作 SFTP 用戶端,我將逐步指導您,以便您可以充分利用這些技術。
AWS Transfer Family 是一項安全、完全託管的服務,可使用 SFTP、AS2、FTPS 和 FTP 等協定將檔案傳入和傳出 AWS 儲存服務(例如 Amazon S3 和 Amazon EFS)。
將 AWS Transfer Family 與 Golang 整合的建議架構設計由以下元件組成,如下圖所示:
本文提出的 API 作為基本範例來示範其基本功能。在現實場景中,API 可能更複雜並包含其他功能。其主要功能是將檔案上傳到 AWS Transfer Family SFTP 伺服器並將其儲存在 S3 儲存桶中,無論是出於備份目的還是與其他系統整合。用例各不相同,取決於每個組織的需求。以下是一些其他用例範例:AWS Transfer Family Customers。
此外,本文提出的 API 可以使用 AWS Elastic Beanstalk 或 AWS Fargate 等服務部署到 AWS 雲,以實現更高的可擴展性和可用性,具體取決於每個組織的特定要求。
讓我們開始吧!
產生用於連接到 AWS Transfer Family SFTP 伺服器的公鑰和私鑰對。這可以使用以下命令在我們的電腦上本地完成。
$ ssh-keygen -t rsa -b 4096 -f
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]-----+
登入AWS管理主控台並選擇AWS Transfer Family服務並建立伺服器。
選擇SFTP(SSH檔案傳輸協定)進行安全檔案傳輸,然後按一下「下一步」。
選擇身分提供者並選擇「服務託管」。
在端點設定中,選擇“公開存取”,然後按一下“下一步”。
我們選擇「Amazon S3」作為儲存選項,然後按一下「下一步」。
在「配置其他詳細資料」部分中,將設定保留為預設值。
審核,按一下「下一步」並建立。
創建完成後,我們將會得到類似這樣的東西。我們可以看到我們還沒有任何用戶,它將很快透過公共端點啟動並使用 S3 作為儲存。
為 AWS 傳輸系列到 s3 服務建立一個新角色。為此,請前往 IAM 服務並建立 AWS 服務類型的新角色,然後在用例中選擇「傳輸」和「下一步」。
權限策略,AmazonS3FullAccess 擁有對 S3 儲存桶的完全存取權。但這個策略是非常允許的,不建議在生產中使用。接下來。
我們繼續分配角色的名稱“role-example-transfer-to-s3”,我們檢查並點擊“建立角色”。
我們繼續建立 s3 儲存桶,為此,我們轉到 s3 服務並建立一個新儲存桶。
我們設定儲存桶的名稱,保留預設配置並建立儲存桶。
儲存桶名稱:「bucket-example-transfer」。
在創建結束時,我們將得到以下內容:
前往 AWS Transfer Family 服務並選擇您先前建立的伺服器。
要閱讀本文,您需要提供在啟動 aws_example_ssh_key.pub 時產生的公鑰。
要查看公鑰的內容,請使用以下指令:
$ cat aws_example_ssh_key.pub
公鑰如下:
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 儲存庫的連結以供參考。此概述將幫助您了解專案的組織以及各個組件的結構和互連方式。
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。
├── cmd │ └── main.go ├── go.mod ├── go.sum └── internal ├── app │ └── service.go ├── domain │ └── models.go ├── handler │ └── sftp_handler.go └── infra ├── config.go └── sftp_client.go
在私鑰和 Transfer Family 使用者憑證所在的 config.go 檔案中設定下列憑證,以連接到 SFTP 伺服器。
$ go get -u github.com/gin-gonic/gin $ go get -u github.com/pkg/sftp
此外,請考慮設定上傳到 SFTP 伺服器的檔案的儲存路徑。就我而言,它是 /bucket-example-transfer/rodrigo。
// config.go 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 用戶端的函數:
// service.go func (u *Service) Upload(file *domain.File) error { return u.sftpClient.UploadFile(file, "/bucket-example-transfer/rodrigo/") }
上傳檔案到SFTP伺服器的方法。
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 以驗證文件是否已正確上傳。
文件已成功上傳,沒有任何問題。
感謝您的閱讀。
以上是AWS Transfer 系列與 Golang 用於檔案傳輸的詳細內容。更多資訊請關注PHP中文網其他相關文章!