跳至內容

如何將 AWS Transfer Family 伺服器設定為使用另一個 AWS 帳戶中的 Amazon S3 儲存貯體?

2 分的閱讀內容
0

我希望帳戶 A 中的 AWS Transfer Family 伺服器能夠存取另一個帳戶中的 Amazon Simple Storage Service (Amazon S3) 儲存貯體,即帳戶 B。我想透過對跨帳戶存取儲存貯體來設定我的伺服器。

簡短說明

請依照下列步驟執行:

  1. 在帳戶 A 中建立可存取儲存貯體的 AWS Identity and Access Management (IAM) 角色。
  2. 更新儲存貯體政策,授予帳戶 B 中 IAM 角色的跨帳戶存取權。
  3. 在帳戶 A 中建立已設定使用 IAM 角色的 Transfer Family 伺服器使用者。
  4. 確認帳戶 A 中的 Transfer Family 伺服器使用者可以存取帳戶 B 中的 S3 儲存貯體。
  5. (選用) 在帳戶 B 中將 S3 物件擁有權設定為偏好的儲存貯體擁有者。

**注意:**AWS Transfer Family 主控台只會顯示相同帳戶中的 Amazon S3 儲存貯體。若要讓您的 Transfer Family 伺服器搭配另一個帳戶中的儲存貯體使用,您必須使用 AWS Command Line Interface (AWS CLI) 或 AWS SDK。

解決方法

在帳戶 A 中建立可存取儲存貯體的 IAM 角色

為您的伺服器使用者建立 IAM 角色。對於角色的 IAM 政策,請使用以下內容:

**注意:**請將 destination-DOC-EXAMPLE-BUCKET 替換為您要讓伺服器存取的 S3 儲存貯體名稱。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowListingBucketReadandWriteandDelete",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
      ]
    }
  ]
}

**注意:**Transfer Family 需要 s3:PutObjectAcl 權限,才能進行跨帳戶 S3 上傳。

建立 IAM 角色後,請執行 get-role 命令以取得角色 ID,如下所示:

$ aws iam get-role --role-name "ROLE_NAME"

您需要在下一個步驟中使用此角色 ID。

更新儲存貯體政策,授予帳戶 B 中 IAM 角色的跨帳戶存取權

修改目的地儲存貯體的政策,以授予您所建立 IAM 角色的存取權。您可以使用類似以下的儲存貯體政策:

**注意:**請將 arn:aws:iam::123456789012:root 替換為伺服器所屬帳戶的 Amazon Resource Name (ARN)。請將 destination-DOC-EXAMPLE-BUCKET 替換為儲存貯體名稱。請將 AROA1234567890 替換為您所建立 IAM 角色的角色 ID。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "BucketPolicyForTransferFamily",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl",
        "s3:GetObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteObject",
        "s3:GetObjectVersion",
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": [
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
      ],
      "Condition": {
        "StringLike": {
          "aws:userId": "AROA1234567890:*"
        }
      }
    }
  ]
}

此範例政策中的「條件」元素為選用。若要僅授予您指定的 IAM 角色儲存貯體存取權,請包含「條件」元素。或者,移除該元素,以授予伺服器所屬帳戶中所有 IAM 角色與使用者的存取權。

在帳戶 A 中建立使用 IAM 角色設定的 Transfer Family 伺服器使用者

1.    為您的 Transfer Family 伺服器產生 SSH 金鑰

2.    取得您伺服器的伺服器 ID

3.    使用 AWS CLI 執行 create-user 命令。在 --server-id,請輸入您的伺服器 ID。在 --role,請輸入您所建立 IAM 角色的 ARN。在 --ssh-public-key-body,請輸入您在建立 SSH 金鑰時所產生的 .pub 檔案內容。

$ aws transfer create-user --user-name "MY_SERVER_USER_NAME" --server-id "MY_SERVER_ID"  --role "MY_IAM_ROLE_ARN" --home-directory "/destination-DOC-EXAMPLE-BUCKET/MY_SERVER_USER_NAME" --ssh-public-key-body "CONTENTS_OF_MY_SSH_.PUB_FILE"

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確定您使用的是最新版本的 AWS CLI

此命令會傳回伺服器 ID 與您所建立的使用者:

{
  "ServerId": "MY_SERVER_ID",
  "UserName": "MY_SERVER_USER_NAME"
}

**重要:**若要將伺服器使用者的存取權限制為僅限其主目錄,請在 IAM 中建立縮減範圍政策。接著,編輯伺服器使用者的屬性,以套用您所建立的縮減範圍政策。

確認帳戶 A 中的 Transfer Family 伺服器使用者可以存取帳戶 B 中的儲存貯體

1.    以您所建立的使用者身分連線至您的伺服器。例如,下列 OpenSSH 命令會連線至 SFTP 伺服器:

$ sftp -i myserveruser MY_SERVER_USER_NAME@MY_SERVER_ID.server.transfer.us-east-1.amazonaws.com

2.    請列出儲存貯體的主目錄作為測試。若您使用 OpenSSH,請執行以下命令:

$ ls

若命令成功傳回主目錄,則表示您的伺服器使用者具有儲存貯體的跨帳戶存取權。

(選用) 在帳戶 B 中將 S3 物件擁有權設定為偏好的儲存貯體擁有者

根據預設,Amazon S3 物件由上傳物件的 AWS 帳戶擁有。這表示上傳至目的地儲存貯體的物件,預設會由來源伺服器的帳戶所擁有。

若要讓目的地帳戶自動擁有跨帳戶上傳的物件,請將目的地儲存貯體的 S3 物件擁有權設定為偏好的儲存貯體擁有者。完成此設定後,所有透過 AWS Transfer Family 伺服器上傳的新物件,將自動由目的地儲存貯體的帳戶所擁有。


相關資訊

CreateUser (AWS Transfer Family 使用者指南)

新增使用者 (AWS Transfer Family 使用者指南)

Amazon S3 如何授權請求

AWS 官方已更新 5 年前