Open kagami-tsukimura opened 1 month ago
S3のtfstateファイルがSSE-S3からSSE-KMSに変更された後も、既存のサービスをterraform destroyできる理由は、tfstateファイルの暗号化アルゴリズムがTerraformのリソース管理に直接関与しないためです。
理由の詳細 tfstateはデータの構造を保持: tfstateファイル自体は、Terraformが管理するリソースの状態をJSON形式で記録するものです。 暗号化はS3での保存時にファイルを保護するためのものですが、ファイルの中身(データ構造そのもの)は暗号化とは独立して管理されます。 Terraformがファイルを読み込む際、AWSはS3の暗号化アルゴリズムに関係なく、その内容を復号して提供します。 したがって、SSE-S3からSSE-KMSに変わっても、ファイルの中身は変わらず、Terraformは問題なくリソース管理を続けられます。
Terraformは復号されたtfstateを使用: tfstateファイルの暗号化は、保存されている状態のセキュリティを守るためのものです。 AWSが提供する復号プロセスによって、Terraformは常に復号済みのtfstateを使用します。 暗号化方式がSSE-S3からSSE-KMSに変更されても、AWSはバックグラウンドでファイルを適切に復号するため、Terraformがリソースの削除(destroy)などの操作を問題なく行えるのです。
リソースの操作に必要な情報は変わらない: tfstateに保存されたリソース情報は、Terraformがそのリソースを削除するための必要なデータを含んでいます。 Terraformは、tfstateがどのように暗号化されているかに関係なく、この情報を利用して適切にリソース操作を行います。 したがって、たとえtfstateがSSE-S3で作成されていても、SSE-KMSに変更された状態でdestroyを実行することは可能です。
まとめ 暗号化はS3バケットでの保存時のセキュリティを向上させるものであり、Terraformがリソースを管理・操作するために必要な情報に直接影響を与えるものではありません。 そのため、tfstateファイルの暗号化方式が変わっても、リソースのdestroyや他の操作が正常に機能するのです。
S3の暗号化って、tfstate参照する際はAWS側で復号してくれて、復号あとのもの使えるってこと? だからSSE-S3でtfstate作っての実行中サービスが、SSE-KMSにしてもデリートできた?
ChatGPT: ChatGPT はい、その通りです。S3の暗号化はAWSが管理しており、tfstateファイルを参照する際にはAWS側で自動的に復号化されます。以下にその仕組みを詳しく説明します。
S3の暗号化と復号化の仕組み 暗号化の管理:
S3に保存されたオブジェクト(この場合はtfstateファイル)は、暗号化方式(SSE-S3またはSSE-KMS)に基づいて暗号化されます。この暗号化はAWSが管理し、ユーザーはその詳細を意識する必要はありません。 自動復号化:
S3からオブジェクトを取得する際、AWSは暗号化されているオブジェクトを自動的に復号化し、ユーザーに返します。つまり、tfstateファイルをTerraformが参照する際、AWSは内部で復号化を行い、Terraformには復号化後のデータが渡されます。 異なる暗号化方式間の互換性:
既存のリソースがSSE-S3のtfstateファイルで作成された場合でも、その後SSE-KMSに変更しても、Terraformは既存のリソースに対して操作を行うことができます。これは、AWSが復号化を自動で行ってくれるため、Terraformが適切な状態を取得できるからです。 具体的なポイント 削除(デリート)の実行:
SSE-S3で作成されたリソースは、暗号化の方式が異なっても、Terraformがリソースの状態を把握している限り、問題なく削除(destroy)することができます。AWSは、どの暗号化方式であっても、オブジェクトを適切に処理します。 暗号化方式の変更の影響:
tfstateファイルがSSE-S3であっても、AWSが復号化を行うため、SSE-KMSに変更しても、既存のリソースに対する操作には影響がありません。 結論 したがって、S3の暗号化に関しては、AWSが自動的に復号化を行ってくれるため、異なる暗号化方式のtfstateファイルがあっても、Terraformは正しく機能します。これにより、暗号化の違いに関わらず、リソースの操作や削除が可能となります。
S3バケットのデフォルト暗号化をSSE-S3からSSE-KMSに変更 S3バケット内のtfstateをSSE-S3からSSE-KMSに変更 でOK
→terraform暫く動かさないからtfstateも手動で変えるが、(コマンド打てばローカルからS3のtfstate見に行って勝手に最新化される。) ※terraformコマンドで(ローカルのtfstateを)S3のtfstateの更新が発生するが、その際に暗号化はS3バケットのデフォルト暗号化と同じになる。 ★そのため、S3バケットのデフォルトをKMSにして、tfstateもKMSにしておけば今後は意識せずにKMS。
★tfstateの実態はterraform.jsonファイル。 →KMSの暗号化は保存時のファイル保護に使われるが、ファイルの中身自体は暗号化とは独立しているため、tfstateを使う際はAWS側の複合プロセスが走ったあとのファイルを参照する。