前情提要
Storage Transfer Service能帮助我们做什么
- 简化从不同数据源到Google Cloud Storage 的数据迁移。
- 自动化和可配置的数据传输。
- 安全可靠的数据传输。
主要步骤
- 在AWS Identity and Access Management (IAM) 中创建访问密钥
- 在GCP 创建服务账号和服务账号密钥
- 在AWS 创建 SQS 服务
- 配置转移作业的相关配置
- 启动并监控Storage Transfer Service 传输作业
事前检查
- Storage Transfer Service 配置核对
- 成本估算和预算评估。
环境准备
一. 创建访问密钥
1.进入aws控制台页面,点击右上角设置,选择“安全凭证”
2.点击“创建访问密钥”
3.选择使用案例
4.点击“创建访问密钥”
5.下载密钥CSV文件
二. 创建gcp 服务账号并创建密钥
1.进入GCP IAM控制台界面,点击“服务账号”
2.点击创建服务账号
3.输入服务账号名称、服务账号描述,点击“创建并继续”
4.为服务账号附加“Storage Transfer Admin” 角色,然后点击“继续” 再点击“完成”
5.创建服务账号密钥,进入到服务账号权限,点击“密钥”、“添加键”、“创建新密钥”,将密钥文件下载到电脑。
三. 创建 AWS SQS
1.进入AWS SQS控制台,点击创建队列
2.修改访问策略,点击“高级”
将以下json复制粘贴到策略
{
"Version": "2012-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__owner_statement",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "SQS:SendMessage",
"Resource": "RESOURCE",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "AWS"
},
"ArnLike": {
"aws:SourceArn": "S3_BUCKET_ARN"
}
}
}
]
}
上述JSON中的占位符值采用以下格式:
AWS是表示Amazon Web Services项目的数值。例如"aws:SourceAccount": "1234567890"。
RESOURCE是标识此队列的Amazon Resource Number (ARN)。例如"Resource": "arn:aws:sqs:us-west-2:01234567890:test"。
S3_BUCKET_ARN是标识源存储桶的ARN。例如"aws:SourceArn": "arn:aws:s3:::example-aws-bucket"。您可以从AWS控制台的存储桶详情页面的属性标签页中找到存储桶的ARN。
3.点击创建队列。
四. 在S3 存储桶上启用通知。
1.在AWS 控制台中,转到 S3 页面。选择您的源存储桶,选择属性标签页。
2.在事件通知部分,点击创建事件通知。
3.为此事件指定名称。
4.在事件类型部分中,选择所有对象创建事件。
5.选择SQS 队列作为目标,然后选择您为此转移创建的队列,保存更改。
五. 使用python配置Storage Transfer Service 传输作业,并开始作业传输。
1.安装所需要的包:google-cloud-storage-transfer、google-auth
pip install google-cloud-storage-transfer
pip install google-auth
2.使用以下代码
from google.cloud import storage_transfer
from google.oauth2 import service_account
def create_event_driven_aws_transfer(
):
"""Create an event driven transfer between two GCS buckets that tracks an AWS SQS queue"""
credentials = service_account.Credentials.from_service_account_file("YOUR_SERVICE_ACCOUNT_FILE")
client = storage_transfer.StorageTransferServiceClient(credentials=credentials)
# The ID of the Google Cloud Platform Project that owns the job
project_id = 'PROJECT_ID'
# A description of this job
description = 'DESCRIPTION'
# AWS S3 source bucket name
source_s3_bucket = 'S3_BUCKET_NAME'
# Google Cloud Storage destination bucket name
sink_gcs_bucket = 'GCP_BUCKET_NAME'
# The ARN of the SQS queue to subscribe to
pubsub_id = 'SQS_ARN'
# AWS Access Key ID. Should be accessed via environment variable for security purposes.
aws_access_key_id = 'ACCESS_KEY_ID'
# AWS Secret Access Key. Should be accessed via environment variable for security purposes.
aws_secret_access_key = 'SECRET_ACCESS_KEY'
transfer_job_request = storage_transfer.CreateTransferJobRequest(
{
"transfer_job": {
"project_id": project_id,
"description": description,
"status": storage_transfer.TransferJob.Status.ENABLED,
"transfer_spec": {
"aws_s3_data_source": {
"bucket_name": source_s3_bucket,
"aws_access_key": {
"access_key_id": aws_access_key_id,
"secret_access_key": aws_secret_access_key,
},
},
"gcs_data_sink": {
"bucket_name": sink_gcs_bucket,
},
},
"event_stream": {
"name": pubsub_id,
},
},
},
)
result = client.create_transfer_job(transfer_job_request)
print(f"Created transferJob: {result.name}")
create_event_driven_aws_transfer()
运行代码后,显示Created transferJob表示作业成功创建
注意事项
1. Glacier对象在传输的之前需要将对象先还原后再进行传输
2.事件驱动传输会监听发送到Amazon SQS的Amazon S3事件通知, 以了解源存储桶中的对象何时被修改或添加。不会检测对象删除;删除源中的对象不会删除目标存储桶中的相关对象。