最近在專案執行中過程,不免遇到一些老舊系統或開發團隊習慣用 FTP 來傳送資料,因此在千百般不願意下,研究了從 AWS 上架設 FTP 的方式。由於 AWS 官方提供的文件已經算是蠻詳細了,所以本篇文章著重於官方文件沒有交代的細節,減少試誤過程花的時間,建議先讀完官方文件後,在參考本篇文章所補充的細節即可。


AWS 官方文件

  1. 利用 AWS Transfer 建立 FTP: https://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/getting-started-server.html
  2. 為你的 FTP 建立登入帳號: https://docs.aws.amazon.com/zh_tw/transfer/latest/userguide/getting-started-add-user.html
  3. FTP 上傳檔案後,如何被動收到通知: https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html


建立登入帳號注意事項

  1. IAM role 需要啟用對於 S3 和 Transfer 的權限,確保你的 IAM role 的 Trust Relationships 有以下 policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "s3.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "transfer.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

編輯位置

  1. 除了 Trust Relationships 之外, Permissions 也要確保有以下 policy:

{
      "Version": "2012-10-17",
      "Statement": [
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME"
            ]
        },
        {
            "Sid": "HomeDirObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::BUCKET_NAME/*"
        }
    ]
}

其中 BUCKET_NAME 是你的 S3 bucket。

  1. FTP 登入帳號是以 ssh key 的方式登入,無法透過帳號密碼,所以要先產生 ssh key ,產生後會有一組密鑰、一組公鑰,建立使用者時要在 AWS console 上填入的是公鑰,登入時則使用密鑰。