您可以使用以下两种方法之一设置对 Amazon S3 存储桶的访问权限:
支持的区域
Storage Transfer Service 能够从以下 Amazon S3 区域转移数据:af-south-1
、ap-east-1
、ap-northeast-1
、ap-northeast-2
、ap-northeast-3
、ap-south-1
、ap-south-2
、ap-southeast-1
、ap-southeast-2
、ap-southeast-3
、ca-central-1
、eu-central-1
、eu-central-2
、eu-north-1
、eu-south-1
、eu-south-2
、eu-west-1
、{2、/、、、、、、、/}、/}、eu-west-2
eu-west-3
me-central-1
me-south-1
sa-east-1
us-east-1
us-east-2
us-west-1
us-west-2
所需权限
如需使用 Storage Transfer Service 转移来自 Amazon S3 存储桶的数据,您的用户账号或联合身份角色必须具有该存储桶的相应权限:
权限 | 说明 | 使用 |
---|---|---|
s3:ListBucket |
允许 Storage Transfer Service 列出存储桶中的对象。 | 始终必需。 |
s3:GetObject |
允许 Storage Transfer Service 读取存储桶中的对象。 | 如果要转移所有对象的当前版本,则为必需。如果您的清单指定了对象版本,请改用 s3:GetObjectVersion 。 |
s3:GetObjectVersion |
允许 Storage Transfer Service 读取存储桶中特定版本的对象。 | 如果您的清单指定了对象版本,则为必需。否则,请使用 s3:GetObject 。 |
s3:DeleteObject |
允许 Storage Transfer Service 删除存储桶中的对象。 | 将 deleteObjectsFromSourceAfterTransfer 设置为 true 时必需。 |
使用访问凭据进行身份验证
如需使用访问密钥 ID 和密钥向 AWS 进行身份验证,请执行以下操作:
创建 AWS Identity and Access Management (AWS IAM) 用户,并设置便于识别的用户名,如
transfer-user
。对于 AWS 访问类型,选择 Access key - programmatic access(访问密钥 - 以程序化方式访问)。
向用户授予以下角色之一:
- AmazonS3ReadOnlyAccess 提供对来源的只读权限。 它允许转移,但不支持在转移完成后删除来源中的对象。
- 如果您的转移作业配置为删除来源中的对象,请授予 AmazonS3FullAccess。
具有上文所需权限表中的相应权限的自定义角色。最小权限的 JSON 示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::AWS_BUCKET_NAME/*", "arn:aws:s3:::AWS_BUCKET_NAME" ] } ] }
在成功创建用户后,记下访问密钥 ID 和私有访问密钥。
如何将访问密钥 ID 和私有访问密钥传递给 Storage Transfer Service 取决于您用于启动转移作业的界面。
Cloud 控制台
直接在转移作业创建表单中输入值。
如需开始使用,请参阅创建转移作业。
gcloud CLI
按以下格式创建 JSON 文件:
{
"accessKeyId": "AWS_ACCESS_KEY_ID",
"secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}
使用 source-creds-file
标志将文件的位置传递给 gcloud transfer jobs create
命令:
gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
--source-creds-file=PATH/TO/KEYFILE.JSON
REST API
您的 transferSpec
对象必须包含密钥信息作为 awsS3DataSource
对象的一部分:
"transferSpec": {
"awsS3DataSource": {
"bucketName": "AWS_SOURCE_NAME",
"awsAccessKey": {
"accessKeyId": "AWS_ACCESS_KEY_ID",
"secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}
},
"gcsDataSink": {
"bucketName": "GCS_SINK_NAME"
}
}
客户端库
请参阅创建转移作业页面中的示例。
在 Secret Manager 中保存您的访问凭据
Secret Manager 是用于存储和管理密码等敏感数据的安全服务。它使用强大的加密、基于角色的访问权限控制和审核日志记录来保护您的 Secret。
Storage Transfer Service 可利用 Secret Manager 来保护 AWS 访问凭据。您需要将凭据加载到 Secret Manager 中,然后将 Secret 资源名称传递给 Storage Transfer Service。
启用该 API
启用 Secret Manager API。
配置其他权限
用户权限
创建 Secret 的用户需要以下角色:
- Secret Manager Admin (
roles/secretmanager.admin
)
了解如何授予角色。
服务代理权限
Storage Transfer Service 服务代理需要以下 IAM 角色:
- Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor
)
如需向您的服务代理授予角色:
Cloud 控制台
按照说明检索您的服务代理电子邮件。
在 Google Cloud 控制台中,转到 IAM 页面。
点击授予使用权限。
在新的主账号文本框中,输入服务代理电子邮件地址。
在选择角色下拉列表中,搜索并选择 Secret Manager Secret Accessor。
点击保存。
gcloud
使用 gcloud projects add-iam-policy-binding
命令将 IAM 角色添加到服务代理。
按照说明检索您的服务代理电子邮件。
从命令行中,输入以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member='serviceAccount:SERVICE_AGENT_EMAIL' \ --role='roles/secretmanager.secretAccessor'
创建 Secret
使用 Secret Manager 创建 Secret:
Cloud 控制台
转到 Google Cloud 控制台中的 Secret Manager 页面。
点击创建密钥。
输入名称。
在密钥值文本框中,按以下格式输入凭据:
{ "accessKeyId": "AWS_ACCESS_KEY_ID", "secretAccessKey": "AWS_SECRET_ACCESS_KEY" }
点击创建密钥。
创建 Secret 后,请记下 Secret 的完整资源名称:
选择概览标签页。
复制资源 ID 的值。它使用以下格式:
projects/1234567890/secrets/SECRET_NAME
gcloud
如需使用 gcloud 命令行工具创建新 Secret,请将 JSON 格式的凭据传递给 gcloud secrets create
命令:
printf '{
"accessKeyId": "AWS_ACCESS_KEY_ID",
"secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-
检索 Secret 的完整资源名称:
gcloud secrets describe SECRET_NAME
请记下响应中 name
的值。它使用以下格式:
projects/1234567890/secrets/SECRET_NAME
如需详细了解如何创建和管理 Secret,请参阅 Secret Manager 文档。
将 Secret 传递给作业创建命令
如需将 Secret Manager 与 Storage Transfer Service 搭配使用,需要使用 REST API 创建转移作业。
将 Secret Manager 资源名称作为 transferSpec.awsS3DataSource.credentialsSecret
字段的值传递:
POST https://storagetransfer.googleapis.com/v1/transferJobs
{
"description": "Transfer with Secret Manager",
"status": "ENABLED",
"projectId": "PROJECT_ID",
"transferSpec": {
"awsS3DataSource": {
"bucketName": "AWS_BUCKET_NAME",
"credentialsSecret": "SECRET_RESOURCE_ID",
},
"gcsDataSink": {
"bucketName": "CLOUD_STORAGE_BUCKET_NAME"
}
}
}
使用联合身份进行身份验证
如需使用联合身份向 AWS 进行身份验证,请执行以下操作:
在 AWS 中创建新的 IAM 角色。
选择 Custom trust policy(自定义信任政策)作为可信实体类型。
复制并粘贴以下信任政策:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "SUBJECT_ID" } } } ] }
将 SUBJECT_ID 替换为开始使用 Storage Transfer Service 时自动创建的 Google 管理的服务账号的
subjectID
。如需检索subjectID
,请执行以下操作:进入
googleServiceAccounts.get
参考页面。系统会打开标题为试用此方法的交互式面板。
在该面板的请求参数下,输入您的项目 ID。您在此处指定的项目必须是您用于管理 Storage Transfer Service 的项目。
点击执行。响应中包含
subjectId
。
向该角色授予以下权限政策之一:
- AmazonS3ReadOnlyAccess 提供来源的只读权限。它允许转移,但不支持在转移完成后删除来源中的对象。
- 如果您的转移作业配置为删除来源中的对象,请授予 AmazonS3FullAccess。
具有上文所需权限表中的相应权限的自定义角色。最小权限的 JSON 示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::AWS_BUCKET_NAME/*", "arn:aws:s3:::AWS_BUCKET_NAME" ] } ] }
为该角色分配名称并创建角色。
创建完成后,查看角色详细信息以检索 Amazon 资源名称 (ARN)。请记下该值,它的格式为
arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME
。
如何将 ARN 传递给 Storage Transfer Service 取决于您用于启动转移作业的界面。
Cloud 控制台
直接在转移作业创建表单中输入 ARN。
如需开始使用,请参阅创建转移作业。
gcloud CLI
按以下格式创建 JSON 文件:
{
"roleArn": "ARN"
}
使用 source-creds-file
标志将文件的位置传递给 gcloud transfer jobs create
命令:
gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
--source-creds-file=PATH/TO/ARNFILE.JSON
REST API
您的 transferSpec
对象必须包含 ARN 信息作为 awsS3DataSource
对象的一部分:
"transferSpec": {
"awsS3DataSource": {
"bucketName": "AWS_SOURCE_NAME",
"roleArn": "ARN"
},
"gcsDataSink": {
"bucketName": "GCS_SINK_NAME"
}
}
客户端库
请参阅创建转移作业页面中的示例。
IP 限制
如果您的 AWS 项目通过 IP 来限制对存储空间的访问权限,您必须将 Storage Transfer Service 工作器使用的 IP 范围添加到允许的 IP 列表。
由于这些 IP 范围可能会发生变化,因此我们会将当前值以 JSON 文件的形式发布到下面的永久地址:
https://www.gstatic.com/storage-transfer-service/ipranges.json
向文件添加新范围后,我们至少会等待 7 天,之后才会使用该范围处理来自 Storage Transfer Service 的请求。
我们建议您至少每周从本文档中提取一次数据,以确保您的安全配置保持最新。如需查看从 JSON 文件提取 IP 范围的示例 Python 脚本,请参阅 Virtual Private Cloud 文档中的这篇文章。
如需将这些范围添加为允许的 IP,请在存储桶政策中使用 Condition
字段,详情请参阅 AWS S3 文档:基于特定 IP 地址管理访问权限。