Terraform:将整个资源组移动到新的 Azure 订阅

2024-04-05

历史上增长的项目及其在 Azure 上的相关基础设施必须进行拆分。幸运的是,它的结构良好,因此很明显我们需要将两个资源组及其附属资源移动到新的 Azure 订阅。

  • 我查过了,大部分资源可以移动 https://learn.microsoft.com/en-us/azure/azure-resource-manager/management/move-support-resources#microsofteventhub,因此不必重新创建并且可以保留数据。

  • 对于那些无法移动的资源,幸运的是我们正在使用terraform,可以运行它来重新创建这些资源。

  • 需要移动的资源是整个terraform-project,因此不需要从当前配置文件中删除资源。所有这些都需要进行新的订阅。

到目前为止一切顺利,但现在我需要了解如何实际进行,以便 terraform 知道移动的资源。我当前看到的唯一选项是手动移动 Azure 门户上的资源,更改 CLI/for terraform 上的订阅,然后运行terraform state rm; terraform import or a terraform mv对于每个资源。

难道没有更简单的方法来实现这一目标吗?这看起来过于麻烦,基本上可以更轻松地删除当前订阅中的整个基础设施,并通过新订阅中的 terraform 重新创建它(不是一个选项!)


It is NOT只需通过更改即可将资源从一个资源组移动到另一个资源组resource_group_name*tf 文件中的参数。 Terraform 1.0.2 将尝试销毁此类资源,因此尝试设置多订阅 terraform 工作区是徒劳的。也正如文档所说:

resource_group_name -(必需)资源组的名称 Linux 虚拟机应该存在。改变这种力量 要创建的新资源。

TL;DR - 没有用于通过 terraform 在资源组或订阅之间迁移 Azure 资源的本机机制

正如您所指出的,手动移动资源并将其保留在 Terraform 中需要进行一些状态文件操作。幸运的是,Azure 资源 ID 非常简单,因此在 bash 中进行简单的字符串处理就可以实现这一目的。

快速而肮脏的 bash 脚本可以用新的替换旧的订阅 UUID,并且与此类似(警告 - 正确的实现取决于您的设置 - 在运行所有语句之前进行一些测试):

# Extract the identifying URLs using terraform plan
terraform  plan | grep "Refreshing state" > terraform-current-states.txt
# Extract the states we know from the configuration
terraform state list > terraform-state-list.txt

# Subscription strings
OLD_SUBSCRIPTION=11111111-1111-1111-1111-111111111111
NEW_SUBSCRIPTION=00000000-0000-0000-0000-000000000000
# Resource group strings (other name)
OLD_RG='SOME_NAME'
NEW_RG='ANOTHER_NAME'

# Iterate over state list
cat terraform-state-list.txt | while read RESOURCE; do
  AZURE_ID=$(grep "${RESOURCE}"  terraform-current-states.txt | cut -d"=" -f2 | tr -d ']')

  # null resources etc can be filtered out - no AZURE_ID
  if [ -z "$AZURE_ID" ]; then
    continue
  fi

  # print out the current resource and azure id mapping as a comment
  echo "# ${RESOURCE} ${AZURE_ID}"

  # replace the subscription and resource group strings (and remove weird characters from terraform
  NEW_AZURE_ID=$(echo ${AZURE_ID} | sed "s/${OLD_SUBSCRIPTION}/${NEW_SUBSCRIPTION}/" | sed "s/${OLD_RG}/${NEW_RG}/g" | sed "s/\x1b\[[0-9;]*m//g")

  # replace the current terraform state with a "state rm" and then "import" command
  echo "terraform state rm ${RESOURCE}; terraform import ${RESOURCE} ${NEW_AZURE_ID}
  "
done > terraform-migration-generated-script.sh

以上产生了一个随时可用的terraform-migration-generated-script.sh脚本与terraform rm and terraform import命令。

不要忘记状态备份,甚至terraform state pull and push在开始之前到不同的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform:将整个资源组移动到新的 Azure 订阅 的相关文章

  • 指定的CGI应用程序遇到错误,服务器终止了进程

    我在 azure 上托管一个 asp net 5 应用程序 代码是为 beta8 编译的 该应用程序在本地环境以及当我在 azure 网站上发布代码时运行良好 我收到一个常见错误 指定的 CGI 应用程序遇到错误 服务器终止了该进程 我能够
  • 将 Azure 网站迁移到 Azure 云服务

    我有一个项目 我计划将 Web 应用程序作为 Azure 网站启动 然后将其迁移到 Azure 云服务 也称为托管服务 如果需要作为扩展策略 做出这个决定是因为我了解到 Azure 网站的开发更加简单 快速 几乎不需要特定于 Azure 的
  • 通过 R 连接到 Azure SQL

    下面的代码允许我通过 R 连接到 Azure SQL 服务器 但是 我只能访问 主 数据库 而不能访问我在下面创建的两个数据库 表格显示为空白 有什么想法吗 谢谢 library RODBC library dplyr library DB
  • 基于生产的 Azure SQL 数据库沙箱

    我有一个大型 Azure Sql 数据库 我需要向团队提供一个沙箱 它是数据库的副本 但允许他们创建 sql 对象 沙箱中的数据需要与生产保持同步 我使用了弹性查询 但是性能并不理想 我查看了数据同步 但公司要求 AD 身份验证 定期恢复生
  • Azure DevOps - 使用 GUI 而不是 YAML 来编辑构建管道

    不久前 Azure DevOps 添加了对 YAML 构建管道的支持 这对于高级用户来说非常好 我明白 专业人士只使用命令行和纯文本工具 GUI 适合弱用户 原因有很多 有没有办法返回 GUI 经典编辑器 来编辑现有管道 我已禁用该功能 如
  • 无法在 Azure Synapse Analytics 中创建表

    我是 Azure Synapse Analytics 的新手 我已经在工作区中创建了数据库 但是当我尝试创建新表时 它显示以下错误 执行查询失败 错误 不支持 CREATE TABLE 附上错误截图和查询 Answer recommende
  • apple-app-site-association 从 azure 请求返回为 application/JSON

    我有以下要求 当在 Azure 网站中请求文件的 URL 时 根文件夹中的可用文件必须返回到 application JSON 举例来说 我有一个名为 apple app site association 的文件 它是一个文本文件 在 az
  • Azure Web 角色中的网站项目

    我正在研究一个新的 ASP Net 项目 我们希望将其托管在 Windows Azure Web 角色中 该项目的技术要求之一是利用 ASP Net 的完整预编译选项 不可更新 单页程序集 Web Site项目模型 与 ASP Net 相反
  • 如何仅将 dist 文件夹部署到 azure 网站?

    我的 azure 网站项目中有 src 文件和 dist 文件夹 project src dist 默认行为上传项目内的所有文件 即 src 和 dist website src dist 我想保持网站干净 只包含 dist 文件 webs
  • 如何将 Azure 映像从一个区域复制到另一个区域

    我在 Azure 区域 加拿大中部 的 Azure 映像中有一个 系统准备 通用 服务器模板 我想使用它在不同的 Azure 区域 美国中部 创建 Azure VM 这不起作用 因此 我需要将该 Azure 映像也驻留在美国中部 如何将我的
  • 是否可以从同一网络上的另一台计算机访问 Azure 模拟器?

    我正在运行带有 VS 2010 SP1 和 Windows Azure SDK 1 5 的 Windows 7 x64 我希望能够在连接到同一网络的 iPhone 上调试 Web 应用程序 以缩短调试周期 IIS 正在这台计算机上运行 并且
  • 部署到 azure 然后收到 403 - 访问禁止

    我正在尝试部署到 Azure Silverlight 应用程序 我已迁移数据库 更新连接字符串并将应用程序发布到 Azure 但是当我单击服务 URL 时 我得到以下信息 403 禁止 访问被拒绝 您无权使用您提供的凭据查看此目录或页面 知
  • Application Insights 快照调试器:快照不是从 .NET 完整框架站点推送的

    我创建了一个全新的 Web 应用程序 NET Full Framework 4 7 2 添加了 Application Insights 快照收集器 但快照未推送到服务器 我什至没有得到Don t see the snapshot trou
  • Terraform:如何安装多个版本的提供程序插件? [复制]

    这个问题在这里已经有答案了 我正在尝试使用 azurerm 提供程序通过 Terraform 0 12 部署 Azure 资源 我有 AKS 模块 它可以在 azurerm 版本 2 5 0 上正常工作 但在 2 9 0 版本上无法正常工作
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 将证书安装到 Azure Web 应用上的受信任根证书存储

    如何将证书安装到 Azure Web 应用程序中 以便我的 azure web 应用程序可以通过 SSL 与远程服务通信 此特定证书未由公共 CA 签名 我使用 openssl 生成了一个 ssl 证书 当我将其安装到本地计算机上受信任的根
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • 逻辑应用的 IP 白名单

    如何将逻辑应用的 IP 地址列入白名单 由逻辑应用程序调用的服务 使用 HTTP 操作 但该服务需要白名单才能调用 那么 如何将逻辑APP列入白名单呢 我们可以使用Azure API管理进行白名单 它发布逻辑App 因为api管理提供静态I
  • 使用 TableController 和 AzureMobileApps 发布新实体时出现错误 500

    我在 AzureMobileApps 上使用 TableController 时遇到问题 我使用脚手架在 Visual Studio 中创建了一个新的 Azure Mobile App TableController 在帖子中 我修改了生成
  • azure 和 google 上的自定义联合代理

    azure 和 google 中的 aws 上的自定义联合代理可以替代什么 在AWS中 我可以创建一个允许联合用户登录并访问这样的资源的url https docs aws amazon com IAM latest UserGuide i

随机推荐