概要
- コード化を楽にしたい
- コード化するにあたって記述方法がわからない対象がある
前提
- AWSの場合
- コード化されていないリソースが存在すること
詳細
コード化補助として使う場合
- 既存の”dev-documents”という名前のS3バケットをインポートしたい場合
- プロジェクトディレクトリを作成後、その中に簡易な設定のmain.tfを作成
$ mkdir old_project
$ cd old_project
$ vi main.tf
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