S3等に置く事はできる。ステートファイルの管理が面倒。リソースの差分がうまく比較できないようで、リソースの更新には不向き。新規作成・破棄を繰り返す用途向きドキュメント・サンプルが不足している。値の説明が書いてあるだけで、具体的にどのような値を入れれば良いのか不明なリソースが沢山ある。マイナーバージョンが0.0.1変わっても、仕様が大きく変わり、コードの互換性が無くなる事も多い。0.11と0.12でコードの互換性が無くなった。開発方針がdevしかなく、stable等の安定版が無い構文ループ処理が分かりにくい。list内にmapがあると要素が取れなかったりする。if等の制御構造が無い。count=0でリソースを作成しないように、三項演算子で制御は一応できるが分かりにくい。遭遇したトラブルEC2セキュリティグループの書き方が複数あり、古い書き方+新しい書き方(aws_security_group_rule)を混在した場合、applyは成功する。2回目のplanでも差分が出て、どちらかが消える。GatewayのSSL証明書の登録が成功したように見えるが、実は成功していない。destroy時は削除確認があるが、EC2セキュリティグループの変更で、EC2が作り直される時には警告はない。plan時に予期しない変更が無いか強く確認が必要。†リソースが増えてくると、planやapplyがどんどん遅くなる。†v0.11とv0.12では挙動がまったく異なる場合がある。関数も入れ子だと動かない場合がある。†Cycleエラーの解消などに利用できる。†EC2をN台作る等、同じ種類のリソースを複数定義する時に使える。2」のように設定する。「count=0」にするとリソースは生成されない。ドキュメントに無くても設定できる。「count.index」でループカウンタとして参照できる。HashiCorpstging型はOKだが、listやdict型は非対応なようだ。v0.12.6で確認。暫定対応として、listはスペースやカンマ区切りでjoinして返す等。terraform-providers/terraform-provider-heroku2.0.0から互換性がなくなって、heroku_appに書いたconfig_varsが差分として出るようになった。†terraformはバージョンが0.0.1でも違うとコードの互換性が無くなる事が多い。そのためバージョンを固定したい場合がある。0.12.0"}v0.11.0以上、0.12.0未満を指定。v0.12.3で試した所、構文チェックをバージョンチェックよりも先に行うようで、v0.11の構文エラーだけ表示されて、バージョンのエラーは出ない。カレントディレクトリをv0.11.xにする。~/で実行すればデフォルト値になる。†v0.11.x以下とコードの互換性が無くなかった。HashiCorp以下コマンドでソースコードを0.12に対応してくれる。幾つかのエラーは解決しなかったので、手動で直す。0.12upgradeリソース名に"."は使えない。length(aws_instance.example[*].id)複数リソース中の単一リソースの参照。indexでアクセスできない箇所でもlengthが使えるようになった。同一のリソースを名前やアカウント、リージョンだけ作成したい時に、コードを共通化できる。Learn不便な点:module内のリソース名は変わっていなくても、module名を変えただけで、リソースの作り直しが発生する。module内でdepends_onが使えないので、moduleが使うリソースは先にできていないと実行に失敗する。hashicorp/terraformリソース内からmoduleへの依存は書ける。Explicitlymodule側:providerが一つだけなら、定義不用。複数ある場合、aliasで分ける。listから空の要素を削除する。stringをsearchで検索して、replaceで置換する。"arn:aws:iam::123456789012:role/example_global"のような文字列が欲しい場合。data.aws_iam_role.example.arnが使える場合は、そちらが良い。戦略:新しいインスタンスを追加して、古いインスタンスは削除。terraform自体、updateが苦手。mapにlistを入れたりできないため、複雑な変数を定義する場合、複数のmapを組み合わせて、lookup()等で参照する方法がある。yamlだとこんな感じの変数をterraformで定義したい。†v0.8.11現在、if文は無い。ドキュメントに無くても設定できる。「count=0」にするとリソースは生成されない。FALSEVALiam_role等のglobalに一つだけあれば良いケースもこれで対応できる。true」等のフラグを用意しておく。moduleを同一アカウントで、複数回使う場合、2回目以降はfalseにしておく。bucektのreadonly用roleを作成。空の時にはpolicyを作成しない。variable)になった。添え字が要素数を超えていてもエラーにならない。wrap-aroundされる。†stateはbackend指定でS3に置けるが、通常default一つしか無い。prodのように分けてstateを管理できる。awsのregion毎に分けても良い。配列の要素の末尾に文字列を結合したい場合がある。userパスワード等に使える。†リソースの作成/削除等で、timeoutする場合がある。使うとJSONが出力できるのでお勧め。やっていた事が公式で一部可能になった。HashiCorp既存リソースからtfstateファイルを生成する。importが実装されていないリソースも多い。リソースIDを一つ一つ指定しなければいけないので面倒。route53をimportしようとするとcrashした。HashiCorp機密情報をtfファイルに書かないようにしたい場合。"key=value"」が複数使える。パスワードをこの方法にしてしまうと、apply時に毎回同じパスワードを入力するハメになるのでお勧めしない。"****"パスワード等、ランダム文字列で良い場合は生成できる。†EBSを追加したり、SGを追加しようとするとEC2を作り直してしまう場合がある。差分があっても無視する後から追加したroot_block_deviceの差分を無視したい。IP等、後で参照したい情報を出力するのに便利。refreshまたはapplyした後でしか表示されない。Variablesでは1つの値しか出力できないようだ。HashiCorpterraform.tf:このファイル内で変数は使えなかった。該当キーが出来ているのが重要。Developers.IO変数に配列が使用できない。GitHubで要望は上がっているようだ。既存のインフラのインポート。v0.7.0からimport機能が実装されたため、Terraformingは不要かもしれない。QiitaCentOS6.xの場合。†バージョンによって動作しない機能があり、古いバージョンに切り替えたい時がある。†https://github.com/hashicorp/terraform/issues1つのpolicyに1つのIAMしか関連付けが出来ない。JPリージョンのIAM:s3-jp-rwにAmazonS3FullAccessを割り当てる。作ろうとすると、IAM:s3-jp-rwのpolicyがデタッチされるまたは、以下の様にusersを配列にする。awsリソースを全部作り直そうとする不具合がある。device」のエラーが出る。v0.3.7へダウングレードした。--target=リソース名で、ハイフン(-)に対応していない。