アタシ、Terraformやるってよ

terraform plan
が終わらない
なんか時々terraform planが終わらないことがあるのでデバッグしたいと思った
以下で可能
export TF_LOG=TRACE
export TF_LOG_PATH='./terraform.log'
terraform plan
参考

ログをオフにしたい場合
export TF_LOG=""
export TF_LOG_PATH=""

特定のmoduleのみ指定して plan / apply / destroy を実行する
以下のコマンドで可能。
terraform [plan|apply|destroy] -target=module.[モジュール名]
ただし、検証を除いて特定のmoduleのapplyyadestroyをあまり乱用しない方が良い。
せっかくterraformで一元管理しているのに、それに反するから(だと思っている)
参考

-targetオプションでresourceを作成するときは以下のようになる。
このようにリソースを定義している場合
resource "aws_lambda_permission" "test" {
...
}
このようになる
terraform [plan|apply|destroy] -target=aws_lambda_permission.test

Apple Silicon(M1, M2など)で発生するエラー
M2 proを使っているのですが、terraformコマンドを使う時にエラーが発生してinitすら実行できませんでした。
発生したエラー
Error: Incompatible provider version
│
│ Provider registry.terraform.io/hashicorp/template v2.2.0 does not have a package available for your current platform,
│ darwin_arm64.
│
│ Provider releases are separate from Terraform CLI releases, so not all providers are available for all platforms. Other
│ versions of this provider may have different platforms supported.
解決方法
tfenvを使いamd64版のterraformを利用することで解消しました。面倒だ。。
rew uninstall terraform
brew install tfenv
TFENV_ARCH=amd64 tfenv install 1.3.7
tfenv use 1.3.7
参考

Error: Failed to load plugin schemas
plan実行時にたまになる。頻発するときもあるが、発生条件がわからない
これを試してみる
zsh を利用している場合は ~/.zshrc に以下の通り追記します。
export GODEBUG=asyncpreemptoff=1
すでに立ち上がっているシェルで適用する場合はこちらの実行も忘れずに。
source ~/.zshrc

これやってから現時点で一度も同エラーが発生していない
いいかも👍

-target
オプションで plan | apply したリソースとdestroyする際の数が一致しない
-
terraform apply
で-target
オプションを使用した場合、指定したリソースとその依存関係にあるリソースがTerraformの内部ロジックに基づいて作成されることがある - 例えばリソースAがリソースBに依存している場合、
terraform apply -target=A
を実行するとAだけでなくBも必要に応じて作成される - 一方、
terraform destroy
で-target
オプションを使用した場合、指定したリソースのみが削除対象となり、依存関係にあるリソースは自動的に削除されない - このためapply 時に作成されたリソースの数とdestroy時に削除されるリソースの数が一致しないことがある

ちょうどterraformが怖くて震えながら構築進めているので助かる

lifecycleを活用して意図しないリソースの削除を防止する
prevent_destroy = true
は意図しないリソースの削除を防いでくれます。

EventBridgeからLambdaを起動したい

作業中のAWSプロファイルを確認/切り替えする
-
aws sts get-caller-identity
:デフォルトプロファイル(または現在の環境変数AWS_PROFILE
で指定されているプロファイル)を使用して認証する -
--profile <プロファイル名>
オプション:明示的に特定のプロファイルを使用して認証する
Terraformを実行する前に意図したAWSアカウントとユーザーで認証されているかを確認するのに役立つ

terraform init
は何をやっているのか
あまり理解せずとりあえずplanやapply前にinitすることが多々あったが、以下のケースで実行すればOK
まとめると以下のケースになります。
tfstate backend を変更した場合
required_providers の version を上げた場合
module を追加した場合
module のバージョンを変更した場合

エラー発生時にChatbotでSlackに通知する
CloudWatch、簡単だと油断していたけど意外と設定項目が多くて大変だった
カスタムフィルターとか理解しなければいけないことが多かった。。引き続きキャッチアップ頑張る

複雑な要件ではないけど、一からインフラの設計〜構築まで一貫してやったの初めてだったかも。
terraformとも仲良くなれて良い経験になった〜〜
構成はこんな感じ。
- EventBridge → Lambda(外部APIからデータ取得) → SQS → Lambda(CRM連携)
- CloudWatchでログ管理とChatbotでSlackにエラー通知