2017年底AWS宁夏区域正式开放运营,AWS宁夏区域部分实例价格比AWS北京区域降价近40%,出于成本原因考虑,很多客户希望把自己的业务迁移到AWS宁夏区域。

迁移范围如下:

  • EC2
  • EBS
  • S3
  • RDS
  • ElastiCatch
  • DynamoDB

1.将 EC2从 BJS 迁移至 ZHY

a)从实例创建AMI

在 EC2 控制台中,在左侧选择栏中点击 Instances,在迁移的实例上右键选择 Image -> Create Image。

可以使用 AWS 管理控制台或命令行创建 AMI。

下图总结了从正在运行的 EC2 实例创建 Amazon EBS 支持的 AMI 的过程。从现有 AMI 开始,启动一个实例,自定义该实例,从该实例创建新 AMI,并最终启动新 AMI 的实例。下图中的步骤与下面的过程中的步骤匹配。

 从实例创建 AMI 的工作流程

从实例创建 AMI 的工作流程

具体操作步骤:

b)复制 AMI

可以使用 AWS 管理控制台、AWS Command Line Interface 或开发工具包、或者 Amazon EC2 API(三者都支持 CopyImage 操作)在 AWS 区域内或跨 AWS 区域复制 Amazon 系统映像 (AMI)。可以复制由 Amazon EBS 支持的 AMIs 和由实例存储支持的 AMIs。您可以复制带加密快照的 AMI,并在复制过程中更改加密状态。

复制源 AMI 将生成完全相同但独立的目标 AMI(具有自己的唯一标识符)。对于 Amazon EBS 支持的 AMI,默认情况下其每个支持快照将会复制到完全相同但独立的目标快照。(唯一的例外是在选择加密或重新加密快照时。) 您可以更改或取消注册源 AMI,这不会对目标 AMI 产生任何影响。反之亦然。

复制 AMI 没有任何费用。但要收取标准存储和数据传输费。

AWS 不会将启动许可、用户定义的标签或 Amazon S3 存储桶许可从源 AMI 复制到新 AMI。复制操作完成之后,可以将启动许可、用户定义的标签和 Amazon S3 存储桶权限应用于新 AMI。

复制实例存储支持的 AMI 的权限

如果您使用 IAM 用户复制实例存储支持的 AMI,则用户必须具有以下 Amazon S3 权限:s3:CreateBucket、s3:GetBucketAcl、s3:ListAllMyBuckets、s3:GetObject、s3:PutObject 和 s3:PutObjectAcl。

以下示例策略允许用户将指定的存储桶中的 AMI 源复制到指定的区域。

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Effect": "Allow",
  6. "Action": "s3:ListAllMyBuckets",
  7. "Resource": [
  8. "arn:aws:s3:::*"
  9. ]
  10. },
  11. {
  12. "Effect": "Allow",
  13. "Action": "s3:GetObject",
  14. "Resource": [
  15. "arn:aws:s3:::ami-source-bucket/*"
  16. ]
  17. },
  18. {
  19. "Effect": "Allow",
  20. "Action": [
  21. "s3:CreateBucket",
  22. "s3:GetBucketAcl",
  23. "s3:PutObjectAcl",
  24. "s3:PutObject"
  25. ],
  26. "Resource": [
  27. "arn:aws:s3:::amis-for-123456789012-in-us-east-1*"
  28. ]
  29. }
  30. ]
  31. }

具体操作步骤:

c)在ZHY启动实例

从 AMI 启动实例,进入启动实例向导,最后在ZHY启动成功

2.将EBS从 BJS 迁移至 ZHY

a)创建快照

b)跨区域复制快照

image 01

c)在ZHY创建卷

image 01

3.将S3从 BJS 迁移至 ZHY

将S3从 BJS 迁移至 ZHY,您有以下两种迁移方案:

  1. 在宁夏区创建一个新的 S3 桶,将数据拷贝到该桶中。
  2. 删除原数据桶并在宁夏区(目标区)重新创建同名 S3 桶,该方案需要一个临时桶作为转移中转。

a)创建新的S3桶

在 S3 控制台中,点击 Create Bucket,选择宁夏作为桶的可用区,在 Copy settings from an existing bucket 选项中,选择您欲做迁移的 S3 桶,可同步两个桶的配置。

在 CLI 端运行以下命令行,开始复制桶内文件。

aws s3 sync s3://SOURCE_BUCKET_NAME s3://NEW_BUCKET_NAME

image 01

创建临时桶,步骤参见(1)。

在 CLI 端逐步运行以下命令行,将旧 S3 桶中的内容存入临时桶。

aws s3 sync s3://foobucket s3://tmpbucket

在控制台中旧 S3 桶删除,等待24小时后该命名重新生效。

重新在宁夏区注册同名 S3 桶。

在 CLI 端逐步运行以下命令行,将临时桶中的文件存入目标桶。

aws s3 sync s3://tmpbucket s3://foobucket

4.将RDS for MySQL从 BJS 迁移至 ZHY

将RDS迁移到ZHY有两种方案

  • 创建快照部署到其他区域
  • 使用DMS服务

方案一 创建快照部署到其他区域

具体操作步骤:

1.登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

2.在导航窗格中,选择 Databases (数据库)

3.在数据库实例列表中,选择您想拍摄快照的数据库实例。

4.对于操作,选择拍摄快照

此时会显示拍摄数据库快照窗口。

5.在快照名称框中,键入快照的名称。

在左侧导航栏中选择 Snapshot,选中刚创建的快照,Actions选择 Copy Snapshot 复制 RDS快照,并将宁夏区域作为快照复制的目标区域。

image 01

接下来就可以通过快照在宁夏区域恢复RDS服务了

方案二 使用DMS服务

使用DMS可以完成7*24 小时在线的数据库最小停机时间迁移,大致流程如下:

  • 创建复制实例

  • 创建目标和源终端节点

  • 为数据库创建迁移任务

  • 确认迁移

可以通过从 AWS 管理控制台选择正在运行的任务来查看任务的统计数据和监控信息,确认迁移完成情况。

 复制状态

5.将ElastiCatch for Redis从 BJS 迁移至 ZHY

迁移ElastiCatch服务分为两个步骤,将ElastiCatch备份到BJS的S3,复制到ZHY的S3后,进行备份恢复。

步骤一 备份 Redis 服务到S3

创建备份前需要停止写入操作。

在控制台选中希望迁移的 Redis 服务,点击上方的 Backup 按钮创建备份。

image 01

在控制台左侧选择栏中点击 Backups 选项,查看刚创建的备份。

image 01

  • 创建一个 S3 桶用来存储 ElastiCache 备份。
  • 依次选择 Permissions -> Access Control List。
  • 在 Access for other AWS accounts 下, 选择 + Add account。
  • 在窗口内添加对应区域的 canonical id
  • 下述选项勾选Yes: List objects Write objects Read bucket permissions
  • 选择 Save,授权 ElastiCache 读写 S3 桶内文件

步骤二 将备份部署到宁夏区域

  • 将位于北京区的 S3 桶中的备份文件迁移至宁夏区,或下载后上传到宁夏的 S3 。
  • 在宁夏区域建立新的 Redis 服务
  • 在 Import data to cluster 项中填入位于宁夏 S3 桶中的备份文件路径

image 01

6. 将 DynamoDB 服务从 BJS 迁移至 ZHY

方案一 使用自定义 API

可以使用 API 将 BJS 的数据转移到 ZHY,根据需要脚本程序配置参数

具体操作步骤:

  1. from __future__ import print_function
  2. import boto3
  3. import argparse
  4. def replicate(table_name, existing_region, new_region, new_table_name):
  5. """
  6. Replicate table in new region.
  7. Creates a new table with existing KeySchema and AttributeDefinitions
  8. default read and write capacity units are set to 5. Change it as required.
  9. Parameters
  10. ----------
  11. table_name: string
  12. Name of the existing table to be replicated.
  13. existing_region: string
  14. Region in which the table is present.
  15. new_region: string
  16. Region in which the table needs to be replicated.
  17. new_table_name: string
  18. Name for the new table to be created, if not given
  19. existing table name is used.
  20. """
  21. existing_table = boto3.resource(
  22. 'dynamodb', region_name=existing_region).Table(table_name)
  23. items = existing_table.scan()['Items']
  24. dynamodb = boto3.resource('dynamodb', region_name=new_region)
  25. print("Creating table '{0}' in region '{1}'".format(
  26. new_table_name, new_region))
  27. table = dynamodb.create_table(
  28. TableName=new_table_name,
  29. KeySchema=existing_table.key_schema,
  30. AttributeDefinitions=existing_table.attribute_definitions,
  31. ProvisionedThroughput={
  32. 'ReadCapacityUnits': 5,
  33. 'WriteCapacityUnits': 5
  34. })
  35. print("Table status:", table.table_status)
  36. table.wait_until_exists()
  37. table.reload()
  38. print("Table status:", table.table_status)
  39. print("Updating table with data...")
  40. if table.table_status == 'ACTIVE':
  41. for item in items:
  42. response = table.put_item(Item=item)
  43. print("PutItem status:",
  44. response['ResponseMetadata']['HTTPStatusCode'])
  45. print("Total items created:", table.scan()['Count'])
  46. if __name__ == "__main__":
  47. parser = argparse.ArgumentParser()
  48. parser.add_argument(
  49. '-t',
  50. '--table_name',
  51. type=str,
  52. required=True,
  53. help="Name of the table to be replicated in new region")
  54. parser.add_argument(
  55. '-r',
  56. '--region',
  57. type=str,
  58. required=True,
  59. help="Region in which the table is present")
  60. parser.add_argument(
  61. '-nr',
  62. '--new_region',
  63. type=str,
  64. required=True,
  65. help="Region in which the table needs to be replicated")
  66. parser.add_argument(
  67. '-nt',
  68. '--new_table_name',
  69. type=str,
  70. help="Name for the new table [Optional], Old table name will be used")
  71. args = parser.parse_args()
  72. if args.new_table_name is None:
  73. args.new_table_name = args.table_name
  74. replicate(args.table_name, args.region, args.new_region,
  75. args.new_table_name)

终端执行如下代码:

  1. python transferDynamoDB.py -t [source table] -r [source region] -nr [destination region]

方案二 使用 EMR Hive迁移数据到宁夏区域

利用 Amazon EMR创建集群,使用 EMR Hive 将 BJS 数据迁移到 ZHY。

具体操作步骤:

启动 Amazon EMR 集群,并使用SSH连接集群

登入 Hive

在 Hive 创建2个 External table,location 分别指向 BJS 和 ZHY。

CREATE EXTERNAL TABLE hive_table

(hive_column1_name hive_column1_datatype, hive_column2_name hive_column2_datatype...)

STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'

TBLPROPERTIES (

"dynamodb.table.name" = "dynamodb_table",

"dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name..."

);

使用 query 将 BJS 数据复制到 ZHY,可使用 insert into 进行复制,以免覆盖原数据。

数据库迁移完毕后,请及时更改服务器配置。