Terraformを始める Pt->2: State Files and Commands

2022.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

パート1では、tfファイルの構成要素であるプロバイダとリソースについて調べました。このブログでは、Terraform を使う人にとって必須となる数々のコマンドを学びます。

また、Terraform の様々なstateファイルとその重要性についても学びます。

Apply, Create and Destroy

基本的なEC2インスタンスを起動するEC2.tfファイルを作ってみましょう。

provider "aws" {
  region     = "us-west-2"
  access_key = "your-access-key"
  secret_key = "your-secret-key"
}


resource "aws_instance" "myFirstEc2Instance" {
  ami           = "ami-0ca285d4c2cda3300"
  instance_type = "t2.micro"
}

terraform plan

あらゆる作成の前に plan コマンドを実行することは必須であり、推奨されるプラクティスです。このコマンドはTerraformが行う変更を知らせてくれます。それはリソースの追加、変更、破壊のいずれかです。Terraformが行った変更を本番環境で確認することを強くお勧めします。

terraform apply

Terraform の apply は、その名の通り、指定されたコードに従ってリソースを実行(作成、変更)するものです。

Terraformは元々とても賢く、安全なので、もう一度計画を示して、実行するためにイエスかノーという形で承認を求めてきます。

terraform destroy

このコマンドは、いくつかの注意点を含んでおります

先に生成したインスタンスを破棄するには、terraform destroy を実行します。

destroyする際の厄介な点

同じファイルにバケットを追加して、terraform applyを実行してみましょう。

resource "aws_s3_bucket" "b" {
  bucket = "terraform-s3-devIOblog-2022-bucket"

  tags = {
    Name        = "for blog"
    Environment = "DevIO"
  }
}

resource "aws_s3_bucket_acl" "example" {
  bucket = aws_s3_bucket.b.id
  acl    = "private"
}

EC2インスタンスだけを削除し、s3バケットを削除しない場合はどうすればよいでしょうか。 すべてのリソースを削除してしまうので、このためにterraform destroyを使用することはできません。

特定のリソースを削除するには、-target フラグと resource.local_resource_namedestroy コマンドを使用する必要があります。

terraform destroy -target aws_instance.myFirstEc2Instance

Note:- 再度terraform planを実行すると、EC2がコードに残っているので、再びEC2インスタンスが追加されます。

特定のリソースを削除するもう一つの方法は、Terraformが無視すべきリソースのコードをコメントアウトすることです。

Terraform state file (.tfstate)

EC2コマンドを選択的に削除してからterraform planを実行すると、TerraformはEC2インスタンスの再作成を試みます。

これは、Terraformがリソースのstateを.tfstate.というファイルに保存していることに起因しています。

TerraformはEC2インスタンスにstateがないことを発見すると、リソースの構築とstateファイルの更新を試みます。

terraform destroy を実行すると、「.tfstate」ファイル内のデータが削除されます。

Note:- Terraformのstateファイルには、Terraform関連の情報だけでなく、EC2のIPアドレスやセキュリティグループなど、環境からの情報も含まれています。

Terraformの.tfstateやそのバックアップファイルを編集(手動)したり変更したりしないことを強く推奨します。

まとめ

すべてのリソースを破壊するのではなく、選択的にリソースを破壊する必要がある状況は数多くあります。このような場合、-target フラグが役に立ちます。

テラフォーム状態がどのように状態を維持するかを理解することは、インフラの状態がどのように管理されるかを知ることになります。