Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Terraform:如何在项目之间迁移状态?_Amazon Web Services_Amazon S3_Terraform - Fatal编程技术网

Amazon web services Terraform:如何在项目之间迁移状态?

Amazon web services Terraform:如何在项目之间迁移状态?,amazon-web-services,amazon-s3,terraform,Amazon Web Services,Amazon S3,Terraform,将资源状态从一个项目(即,移动模块调用)迁移到另一个项目(特别是在使用远程状态存储时)最省力的方法是什么? 虽然在同一个状态文件中重构相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我看不到替代JSON的方法来重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,获取此子模块并将其移动到另一个项目).最简单的选择可能是在新状态文件位置的资源上使用地形导入,然后在旧位置使用地形状态rm 在复制/移动.Terraform文件夹时,Terraform确实会处理一些自动状态迁移,但我只

将资源状态从一个项目(即,移动模块调用)迁移到另一个项目(特别是在使用远程状态存储时)最省力的方法是什么? 虽然在同一个状态文件中重构相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我看不到替代JSON的方法来重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,获取此子模块并将其移动到另一个项目).

最简单的选择可能是在新状态文件位置的资源上使用
地形导入
,然后在旧位置使用
地形状态rm


在复制/移动.Terraform文件夹时,Terraform确实会处理一些自动状态迁移,但我只在移动整个状态文件而不是其中的一部分时使用过这种方法。

我发现最简单的方法是将两个远程状态都拉到本地,在两个远程状态之间移动模块/资源,然后向上推。还要记住,如果要移动模块,不要移动单个资源;移动整个模块

例如:

cd dirA
terraform state pull > ../dirA.tfstate

cd ../dirB
terraform state pull > ../dirB.tfstate

terraform state mv -state=../dirA.tfstate -state-out=../dirB.tfstate module.foo module.foo

terraform state push ../dirB.tfstate

# verify state was moved
terraform state list | grep foo

cd ../dirA
terraform state push ../dirA.tfstate

不幸的是,这是我发现的在多个远程设备之间移动状态的最简单方法

如相关地形Q->

  • 使用较少的资源更容易、更快:
    • CMD
      terraform plan
      terraform
      应用都进行云API调用以验证资源的状态
    • 如果将整个基础结构放在一个组合中,这可能需要很多分钟(即使在同一个组合中有多个文件) 文件夹)
  • 因此,如果您最终使用每个资源的mono-dir,那么按服务、团队、客户机等对它们进行隔离就不会太晚


    在项目/服务之间迁移地形状态的可能程序: 示例场景: 假设我们有一个名为
    common
    的文件夹,其中包含某个项目的所有
    .tf
    文件,我们决定将
    .tf
    Terraform资源分割(移动)到一个名为
    security
    的新项目文件夹中。因此,我们现在需要将一些资源从
    common
    项目文件夹移动到
    security

    案例1: 如果
    安全性
    文件夹仍然不存在(这是最佳方案)

  • 备份存储在相应AWS S3 Bucket中的Terraform后端状态内容(因为它的版本已经过控制,所以我们应该更安全)
  • 将您的控制台放在原始文件夹中,对于我们的情况,执行
    common
    execute
    make init
    ,以确保您的
    .terraform
    本地文件夹与您的远程状态同步
  • 如果
    security
    文件夹仍然不存在(应该为true),则使用目标名称
    security
    克隆(复制)
    common
    文件夹,并更新此新克隆文件夹中的
    config.tf
    文件,以指向新的S3后端路径(考虑一次更新1个帐户,从不太重要的帐户开始,并使用
    地形状态列表
    评估结果)
  • 例如:

    # Backend Config (partial)
    terraform {
      required_version = ">= 0.11.14"
    
      backend "s3" {
        key = "account-name/security/terraform.tfstate"
      }
    }
    
  • 在我们新创建的
    security
    文件夹中,运行
    terraform init
    (不删除复制的
    .terraform
    本地文件夹,该文件夹已在步骤2中生成并同步),其结果将生成资源状态的新副本(交互请求)这是一个安全的操作,因为我们还没有从旧的
    .tfstate
    路径文件中删除资源
  • 有选择地从每个状态(
    terraform state rm module.foo
    )中删除所需资源,以便将所需资源保留在
    /common
    /security
    路径中。此外,必须并行执行必要的更新(添加/删除)每个文件夹中.tf文件中的模块/资源,以保持本地代码基声明和远程
    .tfstate
    同步。这是一个合理的操作,请在不太关键的单个资源中测试该过程
  • <强>作为参考,我们可以考虑以下文档和工具:< /强>

    # Backend Config (partial)
    terraform {
      required_version = ">= 0.11.14"
    
      backend "s3" {
        key = "account-name/security/terraform.tfstate"
      }
    }
    
    • (显然仍与地形0.12不兼容)
    案例2: 如果
    security
    文件夹已经存在,并且在其AWS S3路径中有相关的remote.tfstate,则需要使用不同的步骤和命令序列,可能是以下链接中引用的步骤和命令: 1. 2. 3. 四,

    参考链接:

    # Backend Config (partial)
    terraform {
      required_version = ">= 0.11.14"
    
      backend "s3" {
        key = "account-name/security/terraform.tfstate"
      }
    }
    
    • (显然仍与地形0.12不兼容)

    我使用此脚本在重构时迁移状态。请根据需要随意采用

    src=<source dir>
    dst=<target dir>
    resources=(
        aws_s3_bucket.bucket1
        aws_iam_role.role2
        aws_iam_user.user1
        aws_s3_bucket.bucket2
        aws_iam_policy.policy2
    )
    cd $src
    terraform state pull >/tmp/source.tfstate
    cd $dst
    terraform state pull >/tmp/target.tfstate
    for resource in "${resources[@]}"; do
        terraform state mv -state=/tmp/source.tfstate -state-out=/tmp/target.tfstate "${resource}" "${resource}"
    done
    terraform state push /tmp/target.tfstate
    cd $src
    terraform state push /tmp/source.tfstate
    
    src=
    dst=
    资源=(
    aws_s3_bucket.bucket1
    aws_iam_role.role2
    aws_iam_user.user1
    aws_s3_bucket.bucket2
    aws_iam_政策2
    )
    cd$src
    地形状态拉>/tmp/source.tfstate
    cd$dst
    地形状态拉>/tmp/target.tfstate
    对于“${resources[@]}”中的资源,请执行以下操作
    地形状态mv-state=/tmp/source.tfstate-state out=/tmp/target.tfstate“${resource}”“${resource}”
    完成
    地形状态推送/tmp/target.tfstate
    cd$src
    地形状态推送/tmp/source.tfstate