使用 AWS DataSync 在 AWS Outposts 机架和 Amazon S3 之间自动化
用AWS DataSync自动化AWS Outposts机架与Amazon S3之间的数据同步
关键要点
通过使用AWS Outposts和AWS DataSync,企业能够高效地实现本地与云端之间的数据同步。本文展示了如何通过基础设施即代码IaC来自动化AWS Outposts的部署,并利用DataSync将数据从本地S3同步到AWS S3。此解决方案简化了数据传输流程,优化了成本,并支持更深入的数据分析和处理。许多组织在本地生成大量数据,包括数字图像、传感器数据等。客户需要本地的计算和存储以进行数据摄取,并基于这些数据进行实时预测,通常会在将数据转移到云之前进行本地预处理,以解锁额外的业务价值,例如分析、报告和存档。大规模地自动化云转移过程,往往会导致无差异的同步任务,增加计算负担和成本。
AWS Outposts 使您能够在边缘使用熟悉的AWS API,帮助实现低延迟和数据驻留需求,具备实时决策的能力。 在Outposts上的S3 提供了熟悉的API模型和高性价比的对象存储解决方案。您可以使用 AWS DataSync 将数据从Outposts上的S3同步到AWS,以便进行进一步处理和存档。
本文将介绍如何使用基础设施即代码IaC自动化AWS Outposts的部署。我们将展示如何在Outposts机架上创建一个S3桶,部署并配置DataSync代理,将数据复制到区域内的S3桶,并测试该解决方案。该解决方案允许您在完成本地处理后以简单、自动化的方式将数据移动到AWS,从而帮助您优化成本,并根据用例继续进行适当的外部处理以获得更多见解。
解决方案概述
下图展示了用于表示本文描述的解决方案的参考架构,包含了一个Outposts上的S3桶、DataSync代理和一个位于同一AWS区域内的S3桶。DataSync代理充当代理,提供对S3 on Outposts桶的访问,从而使DataSync服务能够将数据同步回区域内的目标S3桶。
图1 Amazon S3 on Outposts与AWS DataSync之间的数据传输参考架构
前提条件
以下概述需要一个与所选AWS区域连接的Outposts机架,且要具备S3 on Outposts的容量。建议查阅AWS Outposts高可用性设计和架构注意事项中的网络部分,以及机架用户指南以供参考。Amazon S3 on Outposts为您的本地Outposts机架环境提供对象存储,帮助满足本地数据处理和数据驻留需求。利用S3的API和功能,S3 on Outposts使得存储、保护、标记、检索、报告和控制对Outposts上数据的访问变得简单。
此流程假设扩展了一个虚拟私有云VPC,配置如下:
AWS区域内部署了互联网网关。在Outposts上部署公共子网,用于托管DataSync代理以简化激活。在区域内部署一个S3目标桶作为DataSync目标。配置一台拥有Terraform的工作站。在相应的AWS区域内配置一个通过NAT网关提供互联网访问的私有子网,用于测试实例。流程步骤
要实现从Amazon S3 on Outposts到AWS区域的数据传输自动化,请完成以下步骤:
配置Outposts上的S3,完成原始源配置。在Outposts上部署DataSync代理以促进数据复制。测试DataSync任务以验证功能。步骤1 配置AWS Outposts上的Amazon S3
Outposts上的S3提供与S3兼容的对象存储,为满足数据驻留和延迟要求而设计。Outposts上的S3桶需要S3终端节点才能穿越VPC访问对象。为在Terraform中创建一个名为exampleoutpostbucket 的桶,请使用您的Outposts ID修改以下示例代码。使用 AWS Outposts控制台获取Outposts ID。
hcl
创建Outposts桶
resource awss3controlbucket outpostbucket { bucket = exampleoutpostbucket outpostid = dataawsoutpostsoutpostexampleid}
要访问Outposts上的桶,需在Outposts终端节点上创建S3桶和Amazon S3 on Outposts访问点。请求通过 S3 on Outposts终端节点路由,且该终端节点可以从VPC内以及通过本地网关从本地访问。以下代码会创建安全组、S3终端节点、访问点并将其与桶关联。您需要根据特定用例修改代码。
hcl
创建HTTPS安全组
resource awssecuritygroup sghttps { name = sghttps description = allow https connectivity vpcid = awsvpcvpcid
# 允许VPC CIDR的HTTPS流量 ingress { fromport = 443 toport = 443 protocol = tcp cidrblocks = [ {varcidr}] }
# 允许所有出站流量 egress { fromport = 0 toport = 0 protocol = 1 cidrblocks = [ 0000/0 ] }}
创建Outposts上的S3终端节点
resource awss3outpostsendpoint s3endpointoutpost { outpostid = dataawsoutpostsoutpostexampleid securitygroupid = awssecuritygroupsghttpsid subnetid = awssubnetoutpostsAzAid}
创建S3访问点并与桶关联
resource awss3accesspoint outpostbucketaccesspoint { bucket = awss3controlbucketoutpostbucketarn name = examplebucketaccesspoint
vpcconfiguration { vpcid = awsvpcvpcid }}
步骤2 在AWS Outposts上部署AWS DataSync代理
DataSync可用于将数据从本地环境发送到AWS区域。Outposts的部署模式类似于在本地迁移中使用DataSync。这需要在本地部署一个称为DataSync代理的资源。DataSync代理要求与源存储系统和DataSync服务端点的网络连接。在Outposts上配置DataSync代理需要能够通过HTTPS连接到Outposts上的S3终端节点和DataSync服务端点。DataSync代理需要激活,以启用与AWS DataSync服务的通信。为了实现编程方式激活,Terraform工作站需要能通过HTTP连接到Outposts上的DataSync代理,并通过HTTPS连接到区域内的DataSync服务端点。在本篇文章中,将使用公共IP部署DataSync代理,旨在减少所需的基础设施。在生产环境中,建议从Terraform工作站到DataSync代理使用私有连接。以下安全组允许Terraform管理IP访问DataSync代理。
hcl
DataSync代理安全组
resource awssecuritygroup sgdatasyncagent { name = datasync agent security group description = DataSync代理安全组 vpcid = awsvpcvpcid
# 入站流量 ingress { fromport = 80 toport = 80 protocol = tcp cidrblocks = [ {varterraformmgmt} ] }
# 出站流量 egress { fromport = 443 toport = 443 protocol = tcp cidrblocks = [ 0000/0 ] }}
接下来,我们将创建IAM权限,授予DataSync代理访问源和目标S3桶的权限。
hcl
信任策略
data awsiampolicydocument datasyncassumerole { statement { actions = [stsAssumeRole] principals { identifiers = [datasyncamazonawscom] type = Service } }}
DataSync源访问策略
data awsiampolicydocument s3sourceaccess { statement { actions = [s3outpostsListBucket s3outpostsListBucketMultipartUploads] resources = [ {awss3accesspointoutpostbucketaccesspointarn} {awss3controlbucketoutpostbucketarn} ] } statement { actions = [s3outpostsAbortMultipartUpload s3outpostsDeleteObject s3outpostsGetObject s3outpostsListMultipartUploadParts s3outpostsGetObjectTagging s3outpostsPutObjectTagging] resources = [ {awss3accesspointoutpostbucketaccesspointarn}/ {awss3controlbucketoutpostbucketarn}/ ] } statement { actions = [s3outpostsGetAccessPoint] resources = [ {awss3accesspointoutpostbucketaccesspointarn} ] }}
DataSync目标策略
data awsiampolicydocument s3destinationaccess { statement { actions = [s3GetBucketLocation s3ListBucket s3ListBucketMultipartUploads s3AbortMultipartUpload s3DeleteObject s3GetObject s3ListMultipartUploadParts s3GetObjectTagging s3PutObjectTagging s3PutObject] resources = [ {awss3bucketRegionbucketarn} {awss3bucketRegionbucketarn}/ ] }}
创建源IAM角色
resource awsiamrole datasyncs3sourceaccessrole { name = datasyncs3sourceaccessrole assumerolepolicy = {dataawsiampolicydocumentdatasyncassumerolejson}}
附加源IAM策略
resource awsiamrolepolicy datasyncs3sourceaccesspolicy { name = datasyncs3sourceaccesspolicy role = {awsiamroledatasyncs3sourceaccessrolename} policy = {dataawsiampolicydocuments3sourceaccessjson}}
创建目标角色
resource awsiamrole datasyncs3destinationaccessrole { name = datasyncs3destinationaccessrole assumerolepolicy = {dataawsiampolicydocumentdatasyncassumerolejson}}
附加目标策略
resource awsiamrolepolicy datasyncs3destinationaccesspolicy { name = datasyncs3destinationaccesspolicy role = {awsiamroledatasyncs3destinationaccessrolename} policy = {dataawsiampolicydocuments3destinationaccessjson}}
接下来,我们将获取最新的DataSync代理Amazon机器映像AMI以便在Outposts上部署。
hcldata awsami datasyncami { mostrecent = true owners = [amazon]
filter { name = name values = [ awsdatasyncx8664gp2 ] }
filter { name = owneralias values = [ amazon ] }}
resource awsinstance datasyncagent { lifecycle { preventdestroy = false } ami = dataawsamidatasyncamiid instancetype = c5large keyname = varkeyname vpcsecuritygroupids = [ {awssecuritygroupsgdatasyncagentid} ] subnetid = awssubnetoutpostsAzAid associatepublicipaddress = true
tags = { Name = outpostdatasyncagent }
rootblockdevice { volumetype = gp2 volumesize = 100 }
metadataoptions { instancemetadatatags = enabled httpendpoint = enabled httptokens = required }}
部署完成后,DataSync代理需要激活。由于Terraform工作站可以与DataSync代理建立连接,因此Terraform工作站可以激活DataSync代理。激活后,我们定义源和目标位置以及DataSync任务。
hcl

DataSync代理注册
resource awsdatasyncagent datasyncagent { ipaddress = awsinstancedatasyncagentpublicip name = datasyncagent}
resource awsdatasynclocations3 source { agentarns = [awsdatasyncagentdatasyncagentarn] s3bucketarn = awss3accesspointoutpostbucketaccesspointarn subdirectory = /
s3config { bucketaccessrolearn = {awsiamroledatasyncs3sourceaccessrolearn} } s3storageclass = OUTPOSTS
tags = { Name = datasyncagentlocations3source }}
resource awsdatasynclocations3 destination { s3bucketarn = awss3bucketRegionbucketarn subdirectory = /
s3config { bucketaccessrolearn = {awsiamroledatasyncs3destinationaccessrolearn} }
tags = { Name = datasyncagentlocations3destination }}
翻墙机场官网登录入口resource awsdatasynctask datasynctask { name = Demo Datasync Task sourcelocationarn = awsdatasynclocations3sourcearn destinationlocationarn = awsdatasynclocations3destinationarn
options { bytespersecond = 1 posixpermissions = NONE uid = NONE gid = NONE verifymode = POINTINTIMECONSISTENT }}
步骤3 测试DataSync任务
Outposts上的S3桶仅可通过Outposts上的访问点访问。为了演示功能,将在区域内的私有子网中部署一个EC2测试实例。以下内容还创建了对Outposts上的S3桶访问所需的IAM角色、策略和实例配置文件。
hcl
测试实例的IAM角色/策略/实例配置文件
data awsiampolicydocument ec2s3sourceaccess { statement { actions = [s3outpostsListBucket s3outpostsListBucketMultipartUploads] resources = [ {awss3accesspointoutpostbucketaccesspointarn} {awss3controlbucketoutpostbucketarn} ] } statement { actions = [s3outpostsAbortMultipartUpload s3outpostsDeleteObject s3outpostsGetObject s3outpostsListMultipartUploadParts s3outpostsGetObjectTagging s3outpostsPutObjectTagging s3outpostsPutObject] resources = [ {awss3accesspointoutpostbucketaccesspointarn}/ {awss3controlbucketoutpostbucketarn}/ ] } statement { actions = [s3outpostsGetAccessPoint] resources = [ {awss3accesspointoutpostbucketaccesspointarn} ] }}
data awsiampolicydocument ec2assumerole { statement { actions = [stsAssumeRole] principals { identifiers = [ec2amazonawscom] type = Service } }}
resource awsiamrole iamroletestec2role { name = ec2testinstancerole assumerolepolicy = {dataawsiampolicydocumentec2assumerolejson}}
resource awsiamrolepolicy ec2s3sourceaccesspolicy { name = datasyncs3sourceaccesspolicy role = {awsiamroleiamroletestec2rolename} policy = {dataawsiampolicydocumentec2s3sourceaccessjson}}
resource awsiaminstanceprofile iamroletestec2profile { name = iamroletestec2profile role = awsiamroleiamroletestec2rolename}