Terraformのplanの対象を絞る(-targetオプション)

-targetオプションの使い方

Terraformのコードが大規模になってくると修正時にterraform planコマンドを実行すると時間がかかるようになってくる。

Terraformのterraform planコマンドで-targetオプションを指定すると、指定したリソースの変更のみを確認できる。
一部の変更のみを確認するので高速に実行できる。

-targetオプションにはリソース名を指定して以下のように実行する。

$ terraform plan -target=リソース名

リソース名はterraform state listコマンドで確認できる。
参考: terraform show, terraform state show, terraform state listでリソースの情報を確認する

-targetオプションの指定例

例えば以下のリソースの場合。

resource "aws_vpc" "vpc" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true
}

リソース名はaws_vpc.vpcなので、以下のように-targetオプションを指定してterraform planを実行する。

$ terraform plan -target=aws_vpc.vpc

依存するリソースがあればそのリソースも一緒に確認される。

-targetオプション指定時はメッセージの最後に以下のような警告が表示される。

│ Warning: Resource targeting is in effect
│ You are creating a plan with the -target option, which means that the result of this plan may not represent all of the changes
│ requested by the current configuration.
│ The -target option is not for routine use, and is provided only for exceptional situations such as recovering from errors or
│ mistakes, or when Terraform specifically suggests to use it as part of an error message.

あくまでも一部しか変更を確認できないので、本番環境への適用時の確認では使わないようにする。

複数リソースの指定

-targetオプションで複数のリソースを指定するには以下のように複数の-targetオプションを指定する。

$ terraform plan -target=リソース名 -target=リソース名 ...

moduleの指定

-targetオプションでmoduleを指定すると、そのmodule以下のリソースが対象となる。

$ terraform plan -target=module.モジュール名

例えばmodules/sampleディレクトリに以下のようなモジュールがある場合。

resource "aws_s3_bucket" "test_bucket" {
  bucket = "test-bucket-000000000000"
}

resource "aws_s3_bucket_server_side_encryption_configuration" "test_bucket" {
  bucket = aws_s3_bucket.test_bucket.bucket

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

resource "aws_s3_bucket_public_access_block" "test_bucket" {
  bucket = aws_s3_bucket.test_bucket.bucket

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

大元のmain.tfで上記モジュールを読み込む。

module "sample" {
  source = "./modules/sample"
}

このとき-targetオプションでmodule.sampleを指定すると、modules/sampleディレクトリ以下のリソースが対象となる。

$ terraform plan -target=module.sample

module.sampleリソースの中でもws_s3_bucket_public_access_block.test_bucketのみを確認したい場合は以下のように指定する。

$ terraform plan -target=module.sample.aws_s3_bucket_public_access_block.test_bucket