当前位置: 首页 > 知识库问答 >
问题:

如何使用Terraform/Cloudformation连接AWS数据库迁移服务和Kinesis数据流?

白学
2023-03-14

我正在尝试将本地SQL Server 2016 Enterprise Edition实例中的数据获取到云中。我遇到了一个障碍,所以如果有人对解决方法有任何指导,我真的很感谢你分享你的知识!

我计划使用AWS数据库迁移服务(aws.amazon.com),在这篇文章中我将其称为“DMS”。出于监管原因,数据库必须保持在本地,因此我需要不断地从该数据库中捕获数据并将其发送到云端。在这方面,我将使用更改数据捕获(docs.microsoft.com)。

这个用例在DMS文档中被明确调用,因此它似乎是合适的工具。此外,我从2018年的这篇博文中看到,运动数据流是DMS的有效目标。那太好了;我想使用Kinesis来处理CDC下游的数据。

问题是在DMS目标的Terraform文档(terraform.io)中没有将Kinesis作为endpoint选项类型。这是Terraform github项目(github.com)的一个问题,其他人已经注意到了同样的事情。以及相关的PR(github.com),看起来它应该提供一个修复程序。虽然它似乎取决于另一个修复程序,所以我没有屏住呼吸。

现在,一些具体问题:

  1. 在github问题下面的帖子中,有人提到使用云形态和地形的混合体。一些快速搜索会抛出aws\u cloudformation\u堆栈(terraform.io)作为实现这一点的一种方法。对吗

共有1个答案

姬泰
2023-03-14

不确定回答自己的问题是否有礼貌,(Meta有点不清楚(Meta.stackexchange.com))[https://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question]下面是:

将DMS和Kinesis数据流与Terraform CloudFormation连接

aws_cloudformation_stack确实有效。CloudForm实际上相对简单。下面的第一个代码块显示了我的Terraform。我正在使用Terraform 0.12的templatefile函数将参数插入CloudForm JSON。您在哪里看到

resource "aws_cloudformation_stack" "kinesis_target" {
  name = "xxx-xxx-kinesis-target"

  template_body = templatefile("kinesis-target-stack.json.tpl",
    {
      identifier_alphanumeric = "<Xxx><Xxx>KinesisTarget",
      identifier              = "<xxx>-<xxx>-kinesis-target",
      access_role_arn         = aws_iam_role.dms_data_stream_role.arn,
      stream_arn              = "${data.terraform_remote_state.data_stream.outputs.arn}",
      output_alphanumeric     = var.kinesis_dms_target_arn_output_key
    }
  )
}

需要进一步注意的是,output\u alphanumeric是与此堆栈创建的组件的ARN关联的键的名称。事实证明,在Terraform代码的其他地方使用此值并不完全简单。请参阅(数据源:aws\U cloudformation\U stack(terraform.io))[https://www.terraform.io/docs/providers/aws/d/cloudformation_stack.html].

这带来的复杂性是,您必须在代码中显式声明依赖项,否则当Terraform尝试将该值插入代码库的其他位时,CloudForm堆栈的输出将不可用。或者,您将不得不逐个推出您的更改,注释和非注释资源以手动满足依赖项。恶心。

CloudFormation JSON非常简单:

{
  "Resources": {
    "${identifier_alphanumeric}": {
      "Type": "AWS::DMS::Endpoint",
      "Properties": {
        "EndpointIdentifier": "${identifier}",
        "EndpointType": "target",
        "EngineName": "kinesis",
        "KinesisSettings": {
          "MessageFormat": "json",
          "ServiceAccessRoleArn": "${access_role_arn}",
          "StreamArn": "${stream_arn}"
        }
      }
    }
  },
  "Outputs": {
    "${output_alphanumeric}": {
      "Description": "ARN of DMS Target for Kinesis Data Stream",
      "Value": { "Ref" : "${identifier_alphanumeric}" },
      "Export": {
        "Name": "${output_alphanumeric}"
      }
    }
  }
}

需要注意的是,虽然(AWS::DMS::Endpoint docs(docs.AWS.amazon.com))[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html]声称EngineName属性是必需的,并且它只能是所提供列表中的一个值(不包括运动学),但事实并非如此。

为了清楚起见,我将Engineering Name留在了那里,并期望有一天kinesis会被添加到列表中,并且可能会收紧验证规则。事实上,我还没有尝试在没有Engineering Name存在的情况下部署这个基础设施。尽管如此,推出它没有问题。

所以,这回答了我的问题(1)。

我还没有尝试用Terraform来表达这一点,这样会简洁得多,并且无需明确说明资源之间的依赖关系。我不确定Terraform是否会在CloudForm之外进行engine_name验证;如果是,CloudForm方法可能是目前最好的。如果不是,我宁愿将上述内容重写为纯Terraform。与此同时,我所拥有的工作。

这也回答了我的问题(2)。我不需要屏住呼吸等待这些修复被合并。

仍然打开(3)输入!我还没有得到端到端验证DMS是否能按预期工作,因为我被一个网络问题阻止了。一位评论家对DMS表示怀疑,这有点令人担忧。。。

当我有更多的话要说的时候,我会向你汇报的!

 类似资料:
  • 我想使用terraform、Kinesis数据流和数据消防软管创建,并将它们连接(作为管道)。当我使用UI时,当我去消防软管时,我可以去源- 这是创建动觉流的代码(我从官方动觉文档中获取): 这是数据消防水带的代码: 那么我如何连接它们呢,是不是类似于${aws\u kinesis\u stream.test\u stream.arn}?或者类似的东西? 我使用了aws_kinesis_strea

  • 我读过萨姆·纽曼的《微服务》一书,在关于分裂整体的一章中,他举了一个“打破外键关系”的例子,他承认跨API进行连接会更慢--但他接着说,如果你的应用程序足够快,它比以前慢有关系吗? 这似乎有点油嘴滑舌?人的经历是什么?您使用了哪些技术来使API联接执行得令人满意?

  • 问题内容: 我正在使用Java开发数据库迁移工具。该工具将数据库表及其数据复制到目标数据库。但是我希望它可以在不同的数据库上工作。从mysql复制并在derby等中创建。使用JDBC,我们可以收集有关表及其列的足够信息。但是我要问的是,是否可以使用sql free在Java上重新创建表。我的意思是不同的数据库具有不同的数据类型,有时它们在sql语法上也有所不同。那么JDBC或任何其他库(可以是开放

  • 在开发和维护一个数据库驱动的应用程序时, 数据库的结构会像代码一样不断演变。 例如,在开发应用程序的过程中,会增加一张新表且必须得加进来; 在应用程序被部署到生产环境后,需要建立一个索引来提高查询的性能等等。 因为一个数据库结构发生改变的时候源代码也经常会需要做出改变, Yii 提供了一个 数据库迁移 功能,该功能可以记录数据库的变化, 以便使数据库和源代码一起受版本控制。 如下的步骤向我们展示了

  • 简介 迁移就像是数据库的版本控制, 允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和 Laravel 的 数据库结构生成器配合使用,让你轻松地构建数据库结构。如果你曾经试过让同事手动在数据库结构中添加字段,那么数据库迁移可以让你不再需要做这样的事情。 Laravel 的 Schema 门面 对所有 Laravel 支持的数据库系统提供了创建和操作数据表的相应支持。 生成迁移 使用 Art

  • 数据库迁移可以理解为对数据库结构的版本管理,可以有效的解决团队中跨成员对数据库结构的管理。 生成迁移 通过 gen:migration 生成一个迁移文件,命令后面跟的是一个文件名参数,通常为这个迁移要打算做的事情。 php bin/hyperf.php gen:migration create_users_table 生成的迁移文件位于根目录下的 migrations 文件夹内,每个迁移文件都包