メインコンテンツまでスキップ

「Terraform」タグの記事が4件件あります

全てのタグを見る

· 約2分

概要

  • Infrastructure as Code
  • インフラの構成をコードで管理すること

メリット

  • インフラの構成をコードで管理することで、変更履歴を管理できる
  • コードレビューを通じて、インフラの構成をチェックできる
  • コードを実行することで、インフラの構成を再現できる
  • コードを実行することで、インフラの構成を破棄できる
  • コードを実行することで、インフラの構成を更新できる
  • コードを実行することで、インフラの構成を複製できる
  • コードを実行することで、インフラの構成を移行できる
  • コードを実行することで、インフラの構成をテストできる
  • コードを実行することで、インフラの構成を検証できる
  • コードを実行することで、インフラの構成を監視できる
  • コードを実行することで、インフラの構成をドキュメント化できる
  • コードを実行することで、インフラの構成を可視化できる
  • コードを実行することで、インフラの構成を比較できる
  • コードを実行することで、インフラの構成を分析できる
  • ・・・

参考:https://speakerdeck.com/oracle4engineer/best-practice-of-iac

気が向いたらまとめていく

· 約7分

ignore_changes とは?

ignore_changes は、特定の属性の変更をTerraformが気にしないようにする設定です。これを使うことで、ある属性を手動で変更してもTerraformはそれを無視します。

ignore_changes がない場合とある場合の挙動の違い

ignore_changes がある場合とない場合の挙動の違いを説明します。

ignore_changes がない場合の挙動:

  1. Terraformを実行してリソースを作成
    例えば、AWSのインスタンスを作成するコードを実行します。

    resource "aws_instance" "example" {
    ami = "ami-12345678"
    instance_type = "t2.micro"

    tags = {
    Name = "MyInstance"
    }
    }
  2. 手動でリソースの属性を変更
    この後、AWSの管理コンソールからインスタンスのNameタグを"MyNewInstance"に変更します。

  3. 再度Terraformを実行
    もう一度Terraformのplanapplyを実行すると、Nameタグが"MyInstance"と"MyNewInstance"の間に差異があると検知します。Terraformはこの差異を修正しようとします。すなわち、Nameタグを再び"MyInstance"に戻そうとします。


ignore_changes がある場合の挙動:

  1. Terraformを実行してリソースを作成
    今度はignore_changes を使用して同じリソースを作成します。

    resource "aws_instance" "example" {
    ami = "ami-12345678"
    instance_type = "t2.micro"

    tags = {
    Name = "MyInstance"
    }

    lifecycle {
    ignore_changes = [tags["Name"]]
    }
    }
  2. 手動でリソースの属性を変更
    同様に、AWSの管理コンソールからインスタンスのNameタグを"MyNewInstance"に変更します。

  3. 再度Terraformを実行
    もう一度Terraformのplanapplyを実行しても、今回はNameタグについての変更は無視されます。したがって、TerraformはNameタグの"MyNewInstance"をそのままにして、変更しようとしません。

補足:ignore_changes がある場合でも、stateファイルにはリアルタイムのリソースの状態が保存される

Terraformのignore_changesが設定されている場合でも、Terraformはリアルタイムのリソースの状態をterraform.tfstate(stateファイル)に反映します。ignore_changesplanapplyの際の挙動を制御するものであり、実際のリソースの状態の記録には影響しません。

具体的な動作を詳しく説明します:

  1. ignore_changesが設定されたリソースを作成: 最初に、ignore_changesが設定されたリソースをterraform applyで作成します。この操作後、stateファイルにはそのリソースの最初の状態が保存されます。

  2. リソースを手動で変更: 次に、外部の手段(例えば、クラウドのコンソール)でリソースを手動で変更します。

  3. Terraformのrefreshまたはapplyを実行: この操作を行うと、Terraformはクラウドプロバイダから最新のリソースの状態を取得し、stateファイルを更新します。この時点で、stateファイルには手動で変更されたリソースの状態が反映されます。

  4. 変更の検知: terraform planを実行すると、通常はTerraformがコードとstateファイルの差異を報告します。しかし、ignore_changesが設定されている属性については、この差異は報告されません。それにも関わらず、stateファイル自体には実際のリソースの状態が正確に記録されています。

ignore_changesの挙動を以下の図で説明します。

ignore_changesが設定されていない場合

ignore_changesが設定されている場合

簡単にまとめると、

  • ignore_changesは、Terraformがplanapplyの際に特定の属性の変更を無視するようにするものです。
  • しかし、stateファイルには常にリアルタイムのリソースの状態が保存されます。
  • そのため、手動で変更した後、Terraformの操作でstateファイルを更新すると、その手動変更がstateファイルに反映されますが、その変更はplanapplyで無視されます。

参考:https://dev.classmethod.jp/articles/note-about-terraform-ignore-changes/

まとめ

  • ignore_changes がない場合:Terraformは手動での変更を検知し、それを修正しようとします。
  • ignore_changes がある場合:指定した属性についての変更はTerraformによって無視されます。したがって、手動での変更が維持されます。

この機能は、特定の属性の手動変更を許容したい場合や、外部のプロセスによって頻繁に変更される属性をTerraformの管理外に置きたい場合に有用です。

· 約1分

ケース:GitHubActionsでDockerイメージをECRにプッシュする

TODO:別ページにまとめるなどしたい

  • AWSへのアクセスにはOIDCでIAMユーザーを使う
  • Actionsでは、docker/build-push-action周りを使ってDockerイメージをECRにプッシュする(その他のactionsは適宜調整してね)

参考

· 約3分

ignore_changes は、Terraform のリソースブロック内で使用される属性で、指定されたリソースの特定の属性またはブロックに対する変更を無視するために使用されます。これは、Terraform が既存のリソースを変更しようとする場合に役立ちますが、特定の属性の変更を許可したくない場合に使用されます。

以下は、ignore_changes の基本的な使い方を示す例です。

resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"

lifecycle {
ignore_changes = [ami, instance_type]
}
}

この例では、amiinstance_type の属性に対する変更は Terraform によって無視されます。この意味は、AWSコンソールや別のツールを使用してこれらの属性を手動で変更した場合、次回の terraform planterraform apply の実行時に Terraform がこれらの変更を検出または適用しないことを意味します。

ブロック全体を無視する場合もあります。たとえば、以下のように tags ブロック全体を無視することもできます。

resource "aws_instance" "example" {
ami = "ami-12345678"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}

lifecycle {
ignore_changes = [tags]
}
}

ignore_changes を使用する際の注意点:

  1. 無視する属性やブロックを過度に使用すると、インフラストラクチャの管理が複雑になる可能性があります。最小限に抑え、使用する際の理由をドキュメント化することがおすすめです。
  2. ignore_changes は、特定の状況や一時的な変更を管理する際に役立つツールですが、恒常的に使用することは避けるよう努めてください。

最後に、ignore_changes の使い方や挙動に関する詳細な情報や例については、公式のTerraformドキュメントを参照するとよいでしょう。