最初の宣言と状態ファイルの読み方
目標
宣言1つが、実際のファイルと状態ファイルという2つの結果を同時に作ることを手で確認し、状態を開いて、リソースアドレス・serial・依存関係を読めるようになります。
なぜ重要なのか
宣言的なツールに初めて出会うと、「コマンドを覚える作業」のように見えますが、実際に学ぶべきことは、ツールが何を根拠に判断するかです。Terraformは、コード(望ましい状態)、状態ファイル(最後に知っている状態)、実際のインフラ(今あるもの)の3つを比較して、プランを作ります。そのため、状態ファイルを失うと、ツールはすでに存在するリソースを「初めて見るもの」と見なして、また作ろうとし、状態に残った幽霊リソースについては、「削除する」と言います。このラボで、状態をjqで直接開いて見る理由が、ここにあります。もう1つ、値をハードコードするか、参照するかは、好みではなくグラフの問題です。参照してはじめて、ツールが順序を把握し、あとで前のリソースが変わったときに、後ろのリソースも一緒に更新されます。
ステップ
/opt/lab/fixtures/terraform/starter/main.tfを/root/tf/first/main.tfにコピーして、そのディレクトリで初期化してください。required_providersブロックがそのまま残っている必要があり、初期化のあと、/root/tf/first/.terraform.lock.hclと/root/tf/first/.terraform/providersができて、ロックファイルにlocalプロバイダーが書かれている必要があります。main.tfに、タイプがlocal_file、名前がhelloのリソースを宣言してください。filenameは/root/tf/first/out/hello.txtで、内容を入れる引数の名前はcontentです。- 適用して、
/root/tf/first/out/hello.txtを作成してください。内容はhello opentofuにします。適用のあと、/root/tf/first/terraform.tfstateにlocal_file.helloが登録され、状態に記録されたcontentと実際のファイルの内容が、まったく同じでなければならず、状態のversionは4でなければなりません。 - タイプが
random_pet、名前がsuffixのリソースを追加して、適用してください。lengthは2にして、prefixは指定しないでください。状態にrandom_pet.suffixができて、作られた名前は、단어-단어の形でなければなりません(韓国語の語は「単語-単語」を意味し、単語2つをハイフンでつないだ形です)。 helloの内容をhello labhubに変更して、再び適用してください。ファイルの内容と、状態に記録されたcontentが、どちらもまったくhello labhubで、状態のserialは2以上でなければなりません。- タイプが
local_file、名前がtempのリソースを、/root/tf/first/out/temp.txtとして1回作ってから、また削除してください。削除するときの出力を、/root/tf/first/out/destroy.txtに保存します。終わったあと、temp.txtファイルと、状態のlocal_file.tempは消えて、local_file.helloは残っている必要があります。 - 状態に登録されたリソースアドレスの一覧を、
/root/tf/first/out/state-list.txtに保存してください。local_file.helloとrandom_pet.suffixがそれぞれ1行ずつあり、local_file.tempはない必要があります(ステップ6を終えたあとに取り出してください)。 - タイプが
local_file、名前がsummaryのリソースを、/root/tf/first/out/summary.txtとして作成してください。内容には、random_pet.suffixが作った名前とhello labhubが、どちらも入っている必要があり、2つの値とも、他のリソースの属性を参照して入れる必要があります。適用のあと、状態のlocal_file.summaryのdependenciesに、random_pet.suffixが見えなければなりません。
参考
- この環境のコマンドは
tofuで、terraformという名前でも呼び出せます。サブコマンドとオプションの構造は同じです。 - インターネットはありませんが、
local、random、null、tlsプロバイダーが、イメージ内のファイルシステムのミラーに入っているので、初期化ができます。 - 状態は、目で読むより、
jqで取り出すほうが速いです。.version、.serial、.lineage、[.resources[].type + "." + .resources[].name]くらいで十分です。 - よくある間違い1: 内容の末尾に改行を入れて、状態の
contentがhello labhub\nになること。ステップ5は、正確な一致を見ます。 - よくある間違い2: ステップ8で、作られたペットの名前を目で見て、文字列にそのまま書くこと。ファイルの内容は通っても、依存関係ができず、失敗します。
作業ディレクトリを初期化して、プロバイダーを取得する
/opt/lab/fixtures/terraform/starter/main.tfを/root/tf/first/main.tfにコピーして、そのディレクトリで初期化してください。required_providersブロックがそのまま残っている必要があり、初期化のあと、/root/tf/first/.terraform.lock.hclと/root/tf/first/.terraform/providersができて、ロックファイルにlocalプロバイダーが書かれている必要があります。
フィクスチャの開始ファイルには、required_providersがすでに入っています。そのファイルを作業ディレクトリにコピーして初期化すると、ロックファイルと.terraform/providersができます。この環境は、インターネットの代わりに、イメージ内のファイルシステムのミラーから取得します。
local_fileリソースを宣言する
main.tfに、タイプがlocal_file、名前がhelloのリソースを宣言してください。filenameは/root/tf/first/out/hello.txtで、内容を入れる引数の名前はcontentです。
resource "타입" "이름"で、2つ目のラベルがアドレスの後ろの部分になります(プレースホルダーは、順にタイプと名前です)。ファイルの内容を入れる引数の名前が、複数形ではないという点に注意してください。
適用して、ファイルと状態を一緒に作る
適用して、/root/tf/first/out/hello.txtを作成してください。内容はhello opentofuにします。適用のあと、/root/tf/first/terraform.tfstateにlocal_file.helloが登録され、状態に記録されたcontentと実際のファイルの内容が、まったく同じでなければならず、状態のversionは4でなければなりません。
適用が終わると、実際のファイルとterraform.tfstateが一緒にできます。状態に記録されたcontentと、実際のファイルの内容が同じかを、比較してみてください。この2つが食い違った状態が、そのままドリフトです。versionフィールドがいくつかも、確認してみてください。
random_petでランダムな名前を作る
タイプがrandom_pet、名前がsuffixのリソースを追加して、適用してください。lengthは2にして、prefixは指定しないでください。状態にrandom_pet.suffixができて、作られた名前は、단어-단어の形でなければなりません(韓国語の語は「単語-単語」を意味し、単語2つをハイフンでつないだ形です)。
random_petは、単語をハイフンでつないだ名前を作ります。単語の数を決める引数が何かを探し、接頭辞は指定しないでください。
宣言を変更して、再び適用する
helloの内容をhello labhubに変更して、再び適用してください。ファイルの内容と、状態に記録されたcontentが、どちらもまったくhello labhubで、状態のserialは2以上でなければなりません。
内容だけを変えて再び適用すると、状態のserialが上がります。状態に記録された値と実際のファイルがまったく同じである必要があるので、末尾に改行が入らないようにしてください。
一時的なリソースだけを選んで削除する
タイプがlocal_file、名前がtempのリソースを、/root/tf/first/out/temp.txtとして1回作ってから、また削除してください。削除するときの出力を、/root/tf/first/out/destroy.txtに保存します。終わったあと、temp.txtファイルと、状態のlocal_file.tempは消えて、local_file.helloは残っている必要があります。
宣言からブロックを削除して再び適用すると、そのリソースだけが消えます。削除する前に、出力を先に読んで、残すべきリソースまで対象になっていないかを確認してください。
状態に登録されたアドレスを取り出す
状態に登録されたリソースアドレスの一覧を、/root/tf/first/out/state-list.txtに保存してください。local_file.helloとrandom_pet.suffixがそれぞれ1行ずつあり、local_file.tempはない必要があります(ステップ6を終えたあとに取り出してください)。
状態に何が入っているかを、アドレスだけで表示するサブコマンドがあります。すでに削除したリソースが一覧に残っているなら、手順を間違えたということです。
参照で要約ファイルを作る
タイプがlocal_file、名前がsummaryのリソースを、/root/tf/first/out/summary.txtとして作成してください。内容には、random_pet.suffixが作った名前とhello labhubが、どちらも入っている必要があり、2つの値とも、他のリソースの属性を参照して入れる必要があります。適用のあと、状態のlocal_file.summaryのdependenciesに、random_pet.suffixが見えなければなりません。
他のリソースの属性を式で参照すると、依存関係が自動的にできます。目で見た値を文字列にそのまま書くと、ファイルの内容は合っていても、dependenciesが空になって失敗します。