Zenn
Open15

アタシ、Terraformやるってよ

みうPみうP

特定のmoduleのみ指定して plan / apply / destroy を実行する

以下のコマンドで可能。
terraform [plan|apply|destroy] -target=module.[モジュール名]

ただし、検証を除いて特定のmoduleのapplyyadestroyをあまり乱用しない方が良い。
せっかくterraformで一元管理しているのに、それに反するから(だと思っている)

参考

https://zoo200.net/terraform-module-target/

みうPみうP

-targetオプションでresourceを作成するときは以下のようになる。

このようにリソースを定義している場合

resource "aws_lambda_permission" "test" {
...
}

このようになる
terraform [plan|apply|destroy] -target=aws_lambda_permission.test

みうPみうP

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

参考

https://qiita.com/naokikobashi/items/7c7323184df0619e3895

https://discuss.hashicorp.com/t/template-v2-2-0-does-not-have-a-package-available-mac-m1/35099/24

みうPみうP

Error: Failed to load plugin schemas

plan実行時にたまになる。頻発するときもあるが、発生条件がわからない
これを試してみる

zsh を利用している場合は ~/.zshrc に以下の通り追記します。

export GODEBUG=asyncpreemptoff=1

すでに立ち上がっているシェルで適用する場合はこちらの実行も忘れずに。

source ~/.zshrc

https://zenn.dev/bun913/articles/m1-mac-terraform-unstable

みうPみうP

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

みうPみうP

-targetオプションで plan | apply したリソースとdestroyする際の数が一致しない

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

作業中のAWSプロファイルを確認/切り替えする

  • aws sts get-caller-identity:デフォルトプロファイル(または現在の環境変数 AWS_PROFILE で指定されているプロファイル)を使用して認証する
  • --profile <プロファイル名>オプション:明示的に特定のプロファイルを使用して認証する

Terraformを実行する前に意図したAWSアカウントとユーザーで認証されているかを確認するのに役立つ

みうPみうP

terraform initは何をやっているのか

あまり理解せずとりあえずplanやapply前にinitすることが多々あったが、以下のケースで実行すればOK

まとめると以下のケースになります。
tfstate backend を変更した場合
required_providers の version を上げた場合
module を追加した場合
module のバージョンを変更した場合

https://zenn.dev/ishii1648/articles/e3464a668978cb

みうPみうP

エラー発生時にChatbotでSlackに通知する

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

https://zenn.dev/rescuenow/articles/7bdd4b7a1fc6e7

みうPみうP

複雑な要件ではないけど、一からインフラの設計〜構築まで一貫してやったの初めてだったかも。
terraformとも仲良くなれて良い経験になった〜〜

構成はこんな感じ。

  • EventBridge → Lambda(外部APIからデータ取得) → SQS → Lambda(CRM連携)
  • CloudWatchでログ管理とChatbotでSlackにエラー通知
ログインするとコメントできます