如何将迁移的 Amazon EC2 实例导入基础设施代码

基础设施即代码 (IaC) 建模 使您能够自动执行 亚马逊云科技 资源的生命周期。但是,采用 iaC 的时机可能会有所不同。亚马逊云科技 客户一开始通常会通过将其服务器执行块级复制到云端来快速迁移。当成百上千台服务器需要在严格的时间表内退出其数据中心,而应用程序团队和其他供应商的参与最少时,这很合适。迁移后,客户会寻找更有效地管理其云环境的方法。他们还寻找减少过时的 亚马逊系统映像 (AMI) 数量的方法 。

本博客讨论了使用 亚马逊云科技 应用程序迁移服务 进行服务器迁移 的用例。我们将介绍如何简化 CloudFormation 的导入 和管理您的 转换 实例。 我们使用的是开源 iaC 模板 创建实用程序 Former2 。Former2 支持 亚马逊云科技 CloudFormation 、亚马逊云科技 云开发套件 (亚马逊云科技 CDK ) Terraform 等。 启动后操作 可 确保每个直接转换实例都安装了 系统管理 器代理。 这提供了一种自动执行管理任务(例如 AMI 管理)的简单方法。这使您可以保持迁移速度并减少大规模运营的工作量。

注意事项和先决条件

建议使用以下方法继续撰写本文:

  • 出于测试目的和熟悉实施过程,您可以 启动 Amazon EC2 Linux 实例 , 然后使用应用程序迁移服务触发 数据复制 ,启动测试实例,然后 启动转换实例。 使用较旧的操作系统版本执行补丁或使用 亚马逊云科技 Systems Manager 进行升级。
  • Former2 提供了一个 CLI ,允许直接从命令行使用。请查阅 Former2 GitHub 项目,下载 Former2 并学习如何使用 生成 命令,以及构建 Docker 镜像,我们将该镜像上传到 亚马逊弹性容器注册表 (Amazon ECR)。
  • 对于大规模迁移场景,我们建议使用 亚马逊云科技 解决方案上的 云迁移工厂 。 有关解决方案组件和安装步骤,请参阅 实施指南 。我们的实施程序适用于使用该解决方案执行的迁移浪潮。对于后者,直接 转换实例的 启动 启动后脚本 的 激活是以编程方式进行 的。
  • 使用 亚马逊云科技 Systems Manager Automation 的客户 只需为所用内容付费。消耗量是根据步数和持续时间计算的。 使用 亚马逊云科技 Systems M anager 补丁管理器修补 Linux 和 Windows EC2 实例 以及使用 亚马逊云科技 Systems Manager Inventory 都不会产生额外费用。 有关 系统管理器定价 的详细信息,请访问 亚马逊云科技 网站 。

重要注意事项

由于 Former2 是一个开源实用程序,我们建议在将其导入 CloudFormation 之前对其输出进行全面审查。

解决方案概述

我们假设使用的是重新托管迁移工厂,使用应用程序迁移服务对成批服务器执行服务器迁移,也称为迁移波。如果您使用 亚马逊云科技 解决方案上的 云迁移工厂 或其他协调器来管理应用程序迁移服务任务,则该解决方案 同样适用。

识别 CloudFormation 管理之外的资源

对于具有多个迁移波的重新托管迁移工厂,我们可以构建事件驱动的工作流程,将转换实例添加到 IaC 中。这可以通过监听转换事件的 亚马逊 Ev ent Bridge 规则来实现。直接转换事件存储有关实例 ID 和关联的应用程序迁移服务作业 ID 的数据。我们可以使用 亚马逊 Kinesis Data Firehose 将它们传输到亚马逊简单存储服务(亚马逊 S3) 存储桶(见下图 1)。

With Amazon EventBridge and Amazon Kinesis Data Firehose delivery stream as target, you can put Application Migration Service cutover events to an S3 bucket. Amazon S3 event notifications invoke an AWS Lambda function which reads the server ID from the event log. Then, it invokes Former2, which we run as a task in AWS Fargate. Former2 puts the infrastructure code for the associated server ID in an S3 bucket. The code should be reviewed and then imported into a CloudFormation stack.

图 1。将现有 亚马逊云科技 资源添加到基础设施代码

将资源导入 CloudFormation 管理中

每次 向 亚马逊 S3 放置新对象时,我们都会使用 Amazon S3 事件通知 来调用 亚马逊云科技 Lambda。 Lambda 从 Amazon S3 获取服务器 ID 并启动 Former2,我们将其作为任务在 亚马逊云科技 Fargate 中运行。 Former2 生成基础设施代码并将其放到指定的 S3 存储桶中。然后,您可以使用 亚马逊云科技 CLI 或 亚马逊云科技 管理控制台查看 您的资源并将其 导入 CloudFormation 堆栈,而无需重新创建环境。

启用启动后操作

您可以 随时为所有直接转换实例启用 启动后操作 。这将确保每个实例都安装了 系统管理器代理 , 并将自己报告到 亚马逊云科技 Systems Manager 清单中。将实例添加到系统管理器清单后,您可以使用 Systems Manager 补丁管理器应用就地操作系统 (OS) 补丁, 并使用 Systems M anager 运行命令 自动执行管理任务。 System s Manager 自动化操作手册 可以通过启动新实例并将其就地升级来执行自动升级,从而生成新的 亚马逊系统映像 (AMI) 。 这允许在为用户流量提供服务的同时测试新 AMI,然后将流量切换到新实例。下图对工作流程进行了可视化。

Enabling post-launch actions triggers the installation of Systems Manager agent and adds Systems Manager IAM Role for all cutover instances. Once Systems Manager has added the cutover instances to its Inventory, you can use Patch Manager to patch AMIs and Automation runbooks to upgrade cutover instances.

图 2。为直接转换实例启用自动升级

实施程序

第 1 步。确定相关事件

应用程序迁移服务会在切换事件之前创建临时的 亚马逊弹性计算云 (Amazon EC2) 资源。因此,重要的是只获取直接转换实例。 为此,请将 EventBridge 规则设置为监听 FinalizeCutOver API 调用和 “CUTOVER ” 生命周期状态,如下所示。

{
  "source": ["aws.mgn"],
  "detail": {
    "eventName": ["FinalizeCutover"],
    "responseElements": {
      "lifeCycle": {
        "state": ["CUTOVER"]
      }
    }
  }
}

第 2 步。为 Amazon S3 事件通知创建目的地

Amazon S3 事件通知会启动我们的 Lambda 函数,该函数通过读取 亚马逊云科技ApplicationMigrationServerceSourceServerid 标签(由应用程序迁移服务创建)中的值并制定对我们的 Former2 Docker 映像的生成调用来获取相关的服务器 ID。 我们使用 Python 实现这个逻辑,如下所示。关联的 Lambda 资源需要 Amazon S3 读取权限才能解析切换事件,还需要 EC S: runTask 权限才能调用 Former2。

import json
import boto3

def lambda_handler(event, context):
    # Read S3 Event and identify event file
    s3 = boto3.resource('s3')

    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    content_object = s3.Object(bucket, key)
    
    data = json.load(content_object.get()['Body'])
    
    sourceServerID = data['detail']['responseElements']['sourceServerID']
    
    print(sourceServerID)
    run_former2(sourceServerID)

def run_former2(sourceServerID):
    # Run Former2 CLI using the source Server ID tag as filter
    client = boto3.client('ecs')

    override = {

        "containerOverrides": 
            [ 
                {
                    'name': 'former-poc',
                    'command': ['--cfn-deletion-policy','Retain','--services', 'EC2', '--search-filter', sourceServerID] 
                }
            ] 
    }
    
    response = client.run_task(
    cluster='former', # name of the cluster
    launchType = 'FARGATE',
    taskDefinition='task-former-poc:8', # replace with your task definition name and revision
    count = 1,
    platformVersion='LATEST',
    networkConfiguration={
        'awsvpcConfiguration': {
            'subnets': [
                'subnet-0272da36749d3cbc1'
            ],
            'assignPublicIp': 'ENABLED'
        }
    },
    overrides=override
    )
    return str(response)

第 3 步。设置 Former2

Former2 提供了一个 CLI ,允许直接从命令行使用。它以 Docker 镜像的形式提供,可以直接上传到 亚马逊弹性容器注册表 (Amazon ECR )。 按照 亚马逊 ECR 用户指南 中的步骤将 Former2 CLI Docker 映像推送 到亚马逊 ECR。然后,你可以继续在 Fargate 中定义 Former2 任务,它不需要端口映射或挂载点。记得 为任务创建一个 IAM 角色 ,该角色具有 亚马逊云科技 只读访问权限以及向 Amazon S3 放置权限。

第 4 步。云端信息导入

CloudFormation 用户指南 描述了导入步骤。如果您想导入到现有 CloudFormat ion 堆栈中,则每个资源都必须具有 DeletionPol icy 属性。Former2 会自动添加此内容。

对于构建应用程序堆栈的任何辅助资源,例如 Elastic Load Balancing,您可以使用 desc ribe_stack_resources 亚马逊云科技 命令行接口 (亚马逊云科技 CLI) 命令并传递资源 ID 来确认这些资源是否属于现有 CloudFormation 堆栈。

我们建议保持较小的堆栈以缩小爆炸半径并降低后续变化的风险。应将由不同团队管理且更改频率不同的资源分成不同的堆栈。如果您的应用程序服务器由一个团队管理,而数据库服务器由另一个团队管理,我们建议将这些层拆分成单独的堆栈。

第 5 步。启用应用程序迁移服务启动后操作

通过导航到 设置 并编辑 启动后操作 模板,可以随时 在 亚马逊云科技 应用程序迁移服务中为所有直接转换实例激活启动 操作。 有关更多信息,请查阅 用户指南 。还将为 亚马逊云科技 S y stems Manager创建关联的亚马逊云科技身份和访问管理 (IAM) A cces s Manager 角色 ,以便与实例进行交互。

正在清理

如果您不再需要示例资源,请记住将其删除,以避免将来产生费用。这包括:

  • 删除或禁用 EventB ridge 规则
  • 在 亚马逊云科技 管理控制台上清理 Kinesis Data Firehose 交付流。前往 Amazon Kinesis,然后转到交付流,选择要删除的传输流,然后点击删除。
  • 删除 带有切换事件和基础设施代码的 S3 存储桶
  • 登录 亚马逊云科技 管理控制台,删除触发 Former2 的 Lambda 函数。前往 亚马逊云科技 Lambda 中的函数部分,选择函数,点击操作,然后选择删除。
  • 取消注册 Former2 Fargate 任务定义
  • 终止 用于测试此解决方案的 所有 Amazon EC2 实例(包括转换实例)
  • 删除 所有用于测试所提供解决方案的应用程序迁移服务作业

您可以使用 亚马逊云科技 Cost Explorer 用户界面查看您的成本和使用量。

结论

在这篇文章中,我们使用 Former2 简化了将迁移的 Amazon EC2 实例导入基础设施代码的过程。我们展示了如何设置事件驱动的工作流程以及如何将直接转换实例持续导入 CloudFormation。这样可以将 IaC 状态以外的资源数量降至最低。提出的解决方案可以适应不同的用例,包括快速原型设计和在沙盒环境中试验新的 亚马逊云科技 资源。您还可以从命令行启动 Former2 并控制堆栈中包含哪些 亚马逊云科技 资源。

想了解更多?

  • 将现有资源引入 CloudFormation 管理
  • 使用开源 Former2 加速基础设施即代码开发

作者简介:

罗斯蒂斯拉夫·马尔科夫·

罗斯蒂斯拉夫是 亚马逊云科技 专业服务的首席架构师。作为战略行业的技术负责人,他与亚马逊云科技客户和合作伙伴合作开展云转型计划。工作之余,他喜欢在户外与家人共度时光,探索纽约市的文化。

卡洛斯·安东尼奥·佩雷亚·戈麦斯·

卡洛斯是一名拥有 亚马逊云科技 专业服务的建筑商。他使客户能够在云之旅中成为 亚马逊云科技ome。当他不在云端时,他喜欢在水深处潜水。

Torsten Reitemeyer

Torsten 是 亚马逊云科技 专业服务的高级实践经理。他本质上是一名软件开发人员,他与下一代建筑商合作,使他们能够更快地共同构建。工作之余,他喜欢与家人共度时光,参加音乐会和出国旅行。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。