Terraform的最新和旧版import命令的使用方式
概要 – 简单总结
目前,在業務中有機會使用Terraform,正在將在AWS上構建的內容進行Terraform化。這次使用了import來進行Terraform化,我將記錄下執行方法和一些筆記。
Terraform的概述
HashiCorpによって開発されたオープンソースのインフラストラクチャコード(IaC)ツール
インフラストラクチャの構築、変更、およびバージョニングを効率的に修正、更新が出来る
サーバー、ネットワーク、データベースなどのリソースを含むインフラストラクチャを、宣言的な設定言語でコードとして記述する
以下是Terraform的官方文件参考。
前提
Terraformが動作する環境がある
(以前、私がTerraformの導入方法について記事を書いた事があるので、導入されてない方は参考にして下さい)
导入版本1.5的模块
我正在使用VPC进行导入操作。
操作流程
Terraformの初期化を行う
terraform init
main.tfに下記の記述をする
# 構成文
import {
to = Resource Type.Resource Name
id = "ARN (Amazon Resource Name) または Resource Name"
}
# 入力例
import {
to = aws_vpc.test_vpc
id = "vpc-a01106c2"
}
/*
aws_vpc : Resource Type(リソース タイプ)
test_vpc : Resource Name(リソース ネーム)
"vpc-a01106c2" : ARN or Resource Name
id に関しては、terraformの公式ドキュメントとAWSのコンソール画面を良く確認して、値を貼り付ける
*/
# 構成文
resource "Resource Type" "Resource Name" {
# 何も記載しない。但し、必須入力項目がある場合は、記載する必要がある
}
# 入力例
resource "aws_vpc" "test_vpc" {
# ...
}
[公式]VPC的import方法在每种资源类型的底部描述
- 下記のコマンドを使用して、ファイルを出力する
terraform plan -generate-config-out=generated.tf
# ファイル名は重複してなければ任意の名前で問題ない。test.tf等の名前でもファイルの出力は可能
- 出力されたファイルを修正して、planが通る様にする
古老的进口方式
在老式的import中,使用了模块进行构建。
操作步骤 xù)
Terraformの初期化を行う
terraform init
main.tfとvpc.tfに下記の記述をする
(vpc.tfは、networkディレクトリーの階層に設置する)
module "network" {
source = "./network"
}
resource "aws_vpc" "test_vpc" {
}
- ディレクトリー構成
.
├── .terraform
├── network/
│ └── vpc.tf
├── main.tf
# 以下省略
importの記述に関しては、各リソースタイプの一番下に記載されている為、その部分を参考にして、importコマンドを作成する
# 構文1
terraform import module.[module Name].[Resource Type].[Resource Name] [ARN or Resource Name]
# 構文2(main.tfにresourceの記述がある場合のコマンド)
terraform import [Resource Type].[Resource Name] [ARN (Amazon Resource Name)]
# 入力例1
terraform import module.network.aws_vpc.vpc vpc-a01106c2
# 入力例2(main.tfにresourceの記述がある場合のコマンド)
terraform import aws_vpc.test_vpc vpc-a01106c2
- 上記のコマンドが正常に動作すると下記の出力結果が表示される
# 出力結果
module.network.aws_vpc.vpc: Importing from ID "vpc-*****************"...
module.network.aws_vpc.vpc: Import prepared!
Prepared aws_vpc for import
module.network.aws_vpc.vpc: Refreshing state... [id=vpc-*****************]
Import successful!
The resources that were imported are shown above. These resources are now in
your Terraform state and will henceforth be managed by Terraform.
- 下記のコマンドでTerraformが管理しているすべてのリソースが表示される為、importしたリストが表示されているか確認する
# Terraformの管理下にあるインフラストラクチャの状態(state)を一覧で表示するコマンド
terraform state list
# 出力結果
module.network.aws_vpc.vpc
terraform state showを使用して、importした内容を表示する
(terraform.tfstateにも出力した結果が記載されている為、そこを確認しても良い)
# 構文
terraform state show RESOURCE_TYPE.NAME
# 入力例
terraform state show module.network.aws_vpc.test_vpc
# 出力結果
# module.network.aws_vpc.vpc:
resource "aws_vpc" "test_vpc" {
arn = "arn:aws:ec2:**************:************:vpc/vpc-*****************"
assign_generated_ipv6_cidr_block = false
cidr_block = "0.0.0.0/0"
default_network_acl_id = "acl-*****************"
default_route_table_id = "rtb-*****************"
default_security_group_id = "sg-*****************"
dhcp_options_id = "dopt-*****************"
enable_dns_hostnames = false
enable_dns_support = true
enable_network_address_usage_metrics = false
id = "vpc-*****************"
instance_tenancy = "default"
ipv6_netmask_length = 0
main_route_table_id = "rtb-*****************"
owner_id = "************"
tags = {
"Name" = "test-vpc-1"
}
tags_all = {
"Name" = "test-vpc-1"
}
}
# 一部の値にマスキングを行なっています。
- 出力された内容を修正して、planが通る様にする
補充
清除tfstate文件内容的命令
terraform state rm [消去するmodule or resource]
如何更新tfstate文件
terraform state mv [消去するmodule or resource]
作者创建的代码
我已经将在测试中使用的代码上传到 GitHub,请您确认一下。
以下是可供參考的資料。
-
- [公式]terraformでAWSの設定を行う為の記述方法
-
- [公式]Import
- AWSリソースをTerraform管理対象に「追加」「削除」する方法