Terraform导入备忘录

简要描述

    • コード化を楽にしたい

 

    コード化するにあたって記述方法がわからない対象がある

假设

    • AWSの場合

 

    コード化されていないリソースが存在すること

详细资料

当作为编码辅助工具使用时

    • 既存の”dev-documents”という名前のS3バケットをインポートしたい場合

 

    プロジェクトディレクトリを作成後、その中に簡易な設定のmain.tfを作成
$ mkdir old_project
$ cd old_project
$ vi main.tf
# ---------------------------------------------
# Main Setting
# ---------------------------------------------
//最低限の設定を記述
provider "aws" {
  region = "ap-northeast-1"
}
terraform {
  required_version = ">= 1.1"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.20.1"
    }
  }
}
//importする対象の空リソース定義を記載
resource "aws_s3_bucket" "dev_s3_bucket_sample" {}
//terraform用ディレクトリに移動
$ cd old_project

//ワークスペースを初期化しstateファイルができている事を確認
$ terraform init
$ ls -l terraform.tfstate

//手動で作られたリソースをterraform下に置く(ここでは”dev-documents”という名ですでに存在するS3バケットをインポート)
$ terraform import aws_s3_bucket.dev_s3_bucket_sample dev-documents #インポートする対象はリソース名を指定する
:
Importing from ID "dev-documents"...
Import prepared!
Refreshing state... [id=dev-documents]
:
Import successful!

//インポートされたリソースがstateファイル内に詳細が記載されている事を確認
$ cat terraform.tfstate

//terraform管理下にあるリソースを出力
$ terraform state list                                                         
aws_s3_bucket.dev_s3_bucket_sample

//コード化が終わった不要なのでterraform管理外にする。stateファイルから内容が消える。
$ terraform state rm aws_s3_bucket.dev_s3_bucket_sample
Removed aws_s3_bucket.dev_s3_bucket_sample
Successfully removed 1 resource instance(s).


如果只想应用一部分已存在的资源而不是全部,可以使用terraform apply。

applyしたが既にそのリソースが存在するとしてエラーになってしまった場合、対象のリソースをterraform管理下にしてしまう

以下は例としてsecretmanagerのリソースがすでに存在していてapplyできない場合

Error: error creating Secrets Manager Secret: ResourceExistsException: The operation failed because the secret dev-secretmanager-rds already exists.
//terraform管理下に無いことを確認
terraform state list

//既存のリソースをインポートしてterraform管理下に
terraform import aws_secretsmanager_secret.dev_secretsmanager_rds dev-secretmanager-rds

//terraform管理下に入った事を確認
terraform state list

//terraform全体適用
terraform apply

    • 例:手動作成したRDSをImportする場合

ClusterからまずImport

//rdsclusterの名前(DB識別子)を引数に指定
$ terraform import aws_rds_cluster.dev_rds_cluster dev-rds-cluster
//rdsライターインスタンスの名前(DB識別子)を引数に指定
$ terraform import aws_rds_cluster_instance.dev_rds_cluster_instance dev-rds-instance-01
//rdsリーダーインスタンスの名前(DB識別子)を引数に指定
$ terraform import aws_rds_cluster_instance.dev_rds_cluster_instance dev-rds-instance-02