2019年9月24日火曜日

terraformで特定のリソースだけを削除/作成する

terraformで特定なリソースを削除

terraformでウェブアプリケーションのインフラを構築しました。
検証中にとあるリソースの設定にミスがあることに気づきました。すべて削除して再構築するには時間が…
terraformで特定のリソースだけを削除することができます。

以下、terraformで特定のresourceを削除する方法を紹介します。

以下のバケットの削除を例とします。

resource "aws_s3_bucket" "s3-example" {
    bucket = "${local.name_prefix}-example"
    acl    = "private"
}

オフィシャルサイトのドキュメントを読んだところ、特定のリソースを削除する時にオプション-target RESOURCE_TYPE.NAMEを追加するだけです。
でしたら以下のコマンドを試してみました。

$ terraform destroy --target aws_s3_bucket.s3-example

見事に上記のバケットだけが削除されました。
おまけに、複数のリソースを指定して削除を行う場合は複数回-targetfsオプションをつけることで一回の操作で複数のリソースを削除することができます。

terraform destroy -target RESOURCE_TYPE.NAME -target RESOURCE_TYPE2.NAME

terraformで特定なリソースを作成

terraformで特定なリソースを作成したい場合は削除と同じく-targetをつけます。例:

$ terraform apply --target aws_s3_bucket.s3-example

2019年9月22日日曜日

terraform workspaceとは?

terraformのworkspaceとは?

簡単に言うと、terraformで行った操作や、状態のデータなどを保持する場所です。

terraform workspaceのコマンド一覧は以下の通りです。
$ terraform workspace -h
Usage: terraform workspace

  New, list, show, select and delete Terraform workspaces.

Subcommands:
    delete    Delete a workspace
    list      List Workspaces
    new       Create a new workspace
    select    Select a workspace
    show      Show the name of the current workspace
  • terraform workspace delete:ワークスペースを削除
  • terraform workspace list:ワークスペースの一覧を表示する
  • terraform workspace new:ワークスペースを新規作成
  • terraform workspace select:ワークスペースを選択する
  • terraform workspace show:現在作業中(選択された)ワークスペースの名前を表示

terraform initで最初にワークスペースを初期化した直後に、defaultという名前のワークスペースが作られます。

2019年9月20日金曜日

terraformでRoute53にレコードを追加しようとしたら、「but it already exist」のエラーが発生しました

terraformを使って、Route53にロードバランサーのレコードを追加しようとしたら、エラーが起きました。
使ったソースコードは以下の通りです。
resource "aws_route53_record" "www" {
  zone_id = "Z1234txxxxx"
  name    = "test.com"
  type    = "A"

  alias {
    name                   = "${aws_lb.elb.dns_name}"
    zone_id                = "${aws_lb.elb.zone_id}"
    evaluate_target_health = true
  }
}
調査したところ、タイプ「A」のレコードは一件しか存在できないです。追加ではなく、もし古いレコードが存在していればそれを削除しておく必要があります。
解決方法はとても簡単です。
引数allow_overwrite = trueを追加すれば、もしレコードが存在している場合は上書きしてくれます。
変更後のソースコードは以下になります。
resource "aws_route53_record" "www" {
  zone_id = "Z1234txxxxx"
  name    = "test.com"
  type    = "A"
  allow_overwrite = true

  alias {
    name                   = "${aws_lb.elb.dns_name}"
    zone_id                = "${aws_lb.elb.zone_id}"
    evaluate_target_health = true
  }
}