Amazon web services Terraform:如何在项目之间迁移状态?
将资源状态从一个项目(即,移动模块调用)迁移到另一个项目(特别是在使用远程状态存储时)最省力的方法是什么? 虽然在同一个状态文件中重构相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我看不到替代JSON的方法来重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,获取此子模块并将其移动到另一个项目).最简单的选择可能是在新状态文件位置的资源上使用Amazon web services Terraform:如何在项目之间迁移状态?,amazon-web-services,amazon-s3,terraform,Amazon Web Services,Amazon S3,Terraform,将资源状态从一个项目(即,移动模块调用)迁移到另一个项目(特别是在使用远程状态存储时)最省力的方法是什么? 虽然在同一个状态文件中重构相对简单(即,获取此资源并将其移动到子模块,反之亦然),但我看不到替代JSON的方法来重构到不同的状态文件,特别是如果我们使用远程(S3)状态(即,获取此子模块并将其移动到另一个项目).最简单的选择可能是在新状态文件位置的资源上使用地形导入,然后在旧位置使用地形状态rm 在复制/移动.Terraform文件夹时,Terraform确实会处理一些自动状态迁移,但我只
地形导入
,然后在旧位置使用地形状态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
应用都进行云API调用以验证资源的状态terraform
- 如果将整个基础结构放在一个组合中,这可能需要很多分钟(即使在同一个组合中有多个文件) 文件夹)
在项目/服务之间迁移地形状态的可能程序: 示例场景: 假设我们有一个名为
common
的文件夹,其中包含某个项目的所有.tf
文件,我们决定将.tf
Terraform资源分割(移动)到一个名为security
的新项目文件夹中。因此,我们现在需要将一些资源从common
项目文件夹移动到security
案例1:
如果安全性
文件夹仍然不存在(这是最佳方案)
common
executemake 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不兼容)
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