実践Terraform
https://gyazo.com/e4379aa7fab0b20e0d1f4dbeb7b8760b
著者
出版
Terraformを使う機会がでてきたので途中まで写経しながら読んだ。terraform applyして、その結果をAWS Consoleで確認するというステップでやってみた。
タイトルにAWSと入っている通り、AWS固有の話がそこそこ多いが、入門者としては具体的なほうが理解しやすいので良かったし、写経bilityも高かった。
ただ、typoや、特に途中出でてくるjsonのキーを間違えたときなどのデバッグがちょっと大変だった。17章で出てくるツールを使ったらもしかしたら早く気付けたかもしれないと思った。
また、チーム開発や開発のフローにまで踏み込んでいるのは「実践」という書名の通りでとてもよかった。
第2章 基本操作
~はリソースの状態の変更で、再作成と伴わない。
-と+の場合はリソースの再作成が行われる。
terraformで管理されているリソースはtfstateファイルに現在の状態を記録している。こことHCLの差分をterraform planで出している。
第3章 基本構文
vscode-terraform v2系で直った
https://gyazo.com/bc8f2f97fe780fad10cc5a172d29cead
変数の上書きはコマンド実行時の引数と環境変数でできる。
variableとlocals、定義の仕方が違うのでちょっと混乱するが、大きな違いは実行時に上書きできるかどうか。
宣言するときはlocals、使うときはlocalなのか。
outputについて、当然だけどどこに書いてもOK。上から実行されるわけじゃないよ。
outputで参照した場合もVS Code上ではエラーがでたので、参照がだいたいだめ?
データソースは便利そうだけど、覚えたり調べたりするのが大変そう。resourceもそうなんだけど、IDが文字列だと保管とかもつらいよね。
参照はTYPE.NAME.ATTRIBUTE。なるほど。読み方わかりやすい。
example_public_dnsにアクセスしたらapacheが見えた!なるほど~
SGのegressの意味がよくわからなかったので後で
7章でわかった。ingress <-> egress。
「組み込み関数」のところで、同じ内容のuser_dataをヒアドキュメントからfile関数での読み込みに変えているけど、これでもインスタンスは再作成になっていた。
amiのIDをtypoしていても、planでは気づけない。あくまでもtfstateとの差分をみるだけなんだ。(2回目)
第4章 全体設計
ディレクトリを分けることでモジュールになる
*.tfはすべて読みこむので、ファイルを分割してもいい
第5章 権限管理
policy_document、JSONファイルをどうすると動くのかわからんかった。
リスト5.7と5.8だけでは動かなくてどこかにjsonファイルを置かないといけないだろうな
今回は、main.cfにデータソースとして定義してplanした
第6章 ストレージ
resources = ["arn:aws:s3:::${aws_s3_bucket.alb_log.id}/*"]文字列への埋め込みのやりかた
第7章 ネットワーク
cidr_blockについて
VPCは/16、サブネットは/24で切るのがおすすめ。
他の大きさにするにせよ、統一しておいたほうがよい
インターネットゲートウェイ
VPCは隔離されたネットワークであり、単体ではインターネットと接続できません。
パブリックネットワークでも外にでれないんだっけ?
ルートテーブル
デフォルトでローカルルートが作られるが、これはterraformから制御できない。
aws_route_tableの中に、aws_routeを作って、aws_route_tableをサブネットに設定する
privateサブネットは、同じVPC内のpublic_networkにあるgetewayをnat_gatewayにして、そこを経由してインターネットにでる。という設定をしているのかな。
depends_onで依存関係を記載する必要があるモジュールもあるので、ドキュメントを読もうという話。
ファイアウォール
AWSはサブネットで動作する「ネットワークACL」とインスタンスで動作する「セキュリティグループ」がある
第8章 ロードバランサーとDNS
前章で、security_groupのモジュールにoutputを書いていなかったのでうまく動かなかった。
outputはトップレベルに書くと実行後に出力されて、moduleの中に書くとモジュール外で参照できるようになるのか
ALIASレコードとCNAMEの違い。CNAMEがドメイン名を返すのに対して、ALIASは直接IPアドレスになるから、問い合わせが一回減るのか。
conditionのpath-patternは属性になっている。
第9章
container_definitions.jsonでキーを間違えているとエラーにならずにapplyで無視されることがあるので、AWS Consoleでみるとよい
code:terraform
lifecycle {
}
があると、task_definitionを変更しても、例えばcontainer-definitions.jsonを変えても、serviceが更新されない。AWSコンソールでぽちぽちした。
第12章 設定管理
code:terraform
lifecycle {
}
terraformのファイルに生パスワードを書かない方法として、こうやってあとからCLIで変更する。
第13章 データストア
RDSやElastiCacheの構築はとても時間がかかる。手元だとRDSで17分、ElastiCacheで8分かかった。気長に待つこと。
第14章 デプロイメントパイプライン
ここはデプロイするものがないのでさっと読み飛ばし
第15章 SSHレスオペレーション
ここも飛ばし
第16章 ロギング
Athenaを使う際、クエリの結果を保存するbucketを作る必要があった。
第17章 terraformベストプラクティス
この章は最初に読みたかったかも。tflintとその--deepオプションは、自分が躓いたところを早く気づけたのではないかという気がする。
第18章 AWSベストプラクティス
デフォルトリソースは使わないようにする
ネットワーク系は意図せず使われてしまったときに変更すると広範囲に影響がでてしまう
データストア系は変更ができない!
第21章 構造化
Workspaceは運用が難しいという話があるが、今もそうなのだろうか?便利そうだけど。
第22章 モジュール設計
良いデフォルトを設定することで認知的負荷を下げよう Standard Module Structureに沿って作ろう
semverしよう
第24章 リファクタリング
リファクタリングというよりは、再構築や再設計というテーマな気がする。The Refactoringではない印象。
最初の構築に失敗したときなどのリカバリーの手順としてはとても有用だと思う。
第25章 既存リソースのインポート
まずはここからやるのがよさそう。社ではterraformingを使ってた気がする。
第26章 チーム開発
決め事がうまく言語化されていてよかった。