如何配置我的 AWS Transfer Family 服务器以使用其他 AWS 账户中的 Amazon S3 存储桶?
我希望账户 A 中的 AWS Transfer Family 服务器能够访问另一个账户(即账户 B)中的 Amazon Simple Storage Service (Amazon S3) 存储桶。我想设置自己的服务器以跨账户访问该存储桶。
简短描述
请按照以下步骤执行操作:
- 在账户 A 中创建一个拥有该存储桶访问权限的 AWS Identity and Access Management (IAM) 角色。
- 在账户 B 中更新存储桶策略以向该 IAM 角色授予跨账户访问权限。
- 在账户 A 中创建一个配置有该 IAM 角色的 Transfer Family 服务器用户。
- 验证账户 A 中的 Transfer Family 服务器用户是否可以访问账户 B 中的 S3 存储桶。
- (可选)将 S3 对象所有权设置为账户 B 中的首选存储桶拥有者。
**注意:**AWS Transfer Family 控制台只显示同一账户中的 Amazon S3 存储桶。要让您的 Transfer Family 服务器使用其他账户中的存储桶,您必须使用 AWS Command Line Interface (AWS CLI) 或 AWS 开发工具包。
解决方法
在账户 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 资源名称 (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:*" } } } ] }
此示例策略中的 Condition 元素是可选的。包含 Condition 元素以将存储桶访问权限仅授予您指定的 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
如果命令返回主目录,说明您的服务器用户拥有跨账户访问该存储桶的权限。
(可选)将 S3 对象所有权设置为账户 B 中的首选存储桶拥有者
默认情况下,Amazon S3 对象由上传对象的 AWS 账户所有。这意味着,默认情况下,上传到目标存储桶的对象由源服务器的账户所有。
要使目标账户能够自动拥有跨账户上传的对象,请将目标存储桶的 S3 对象所有权设置为首选存储桶拥有者。执行此操作后,通过 AWS Transfer Family 服务器上传的所有新对象将自动归目标存储桶的账户所有。
相关信息
创建用户(AWS Transfer Family 用户指南)
添加用户(AWS Transfer Family 用户指南)
相关内容
- AWS 官方已更新 3 年前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 7 个月前