Terraformのリファクタリング用のブロック(moved, import, removed)をまとめて削除する

はじめに

Terraformのリファクタリングの機能として、movedimportremoved などのブロックが存在しますが、terraform applyを実行すると不要になることが多いです*1.tf ファイル上にそのまま残しておいてもterraform planやterraform applyをする上で障壁になるわけではないですが、数がそれなりに増えると煩わしさが一定あるため、まとめて削除するコマンドラインツールを書いてみました。

作ったもの

github.com

go install github.com/shmokmt/tfhk/cmd/tfhk@latest
❯ tfhk -recursive .
a/test.tf
b/test.tf
test.tf

terraform fmt みたいな感じで使えます。

合わせて読みたい

*1:https://developer.hashicorp.com/terraform/language/modules/develop/refactoring によると、古いアドレスを参照しているものがあると削除されてしまうため、moved blockは削除しないことを推奨しているらしいです。個人的には複雑な使い方をしてない限りはすぐ消しちゃっても良いかなと思っています。 https://github.com/hashicorp/terraform/blob/3b4964270f3d11ff73c95a9de1a4a5089e0ebe9a/internal/refactoring/move_validate.go moveのバリデーションでもある程度カバーしてくれてそうだし、大丈夫そうに見えるけど、どうなんでしょう。

ghコマンドで特定期間にマージしたPRをインタラクティブにフィルタする

はじめに

人事評価が近づいてきたときとか、年末が近づいてきたときにマージしたPRを軸にどういうことをやってきたか振り返りしたいときがあります。 マージしたPRを手元でザッとインタラクティブにフィルタしつつ、 pecoでURLを開けると便利だな〜と思ったので、雑なコマンドを組み立ててみました。

コマンド

macOSでgh、zsh、jqがインストールされていることが前提です

gh pr list --author "@me" --base main --state merged --search "merged:>2023-06-01 merged:<2023-12-01" --limit 500  --repo "foo/bar" --json "title,url,mergedAt" | jq -r '.[] | [.title, .url, .mergedAt] | @tsv' | peco | awk '{print $2}' | read url; open $url

curlの--aws-sigv4オプションについて

curl には 7.75.0から --aws-sigv4 というオプションが追加されています。 オプション自体の存在は知っていたものの使ったことはありませんでした。 OpenSearchやLambda Function URLsでURL自体はパブリックであるが、IAM認証をかけているケースの疎通確認で試しに使ってみたら便利だったため、備忘録として残しておきます。

例えば、東京リージョンに存在するOpenSearchに対してアクセスする場合は以下のような形式でリクエストで送ることで AWS Signature V4で署名することができます。

curl "{endpoint}" --aws-sigv4 "aws:amz:ap-northeast-1:es" -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"

IAMロールのような一時的なクレデンシャルではなく、IAMユーザーの永続化したクレデンシャルを使ってアクセスする場合は、-H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}"を省いてリクエストすれば良いです。

aws-vaultユーザーを使っている方は aws-vault exec でサブシェルを起動すると環境変数にクレデンシャルがセットされるのでより捗ります。

合わせて読みたい

MySQL(InnoDB)で各テーブルの行フォーマットを確認するクエリ

クエリ

SELECT TABLE_NAME, ROW_FORMAT 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'hoge' AND ENGINE = 'InnoDB';

合わせて読みたい

MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.10 InnoDB の行フォーマット

Fargateを利用したECS Scheduled Taskでタスクが起動しない事象について

「Capacity is unavailable at this time. Please try again later or in a different availability zone」というエラー

2年近くFargateでECS Scheduled Taskを運用していますが、 初めてECS Scheduled Taskが起動しないという事象が発生しました。

EventBridgeはcron式によって期待する時刻に発火していたのですが、ECSタスクが起動した形跡がありませんでした。 CloudTrailでECSのRunTask APIの呼び出し履歴を確認したところ、以下のようなエラーが出ていました。

「Capacity is unavailable at this time. Please try again later or in a different availability zone」

AWSにサポートケースで問い合わせたところ、以下のような回答をいただきました。

  • Fargate基盤側でタスクを起動するために必要となるコンピュートリソースが確保できないときに発生する。
  • AWSでは本事象を解決するために色々工夫しているが、タイミングによっては当該エラーが発生する可能性がある。

続けて、改善案としてEventBridgeとECSの間にStep Functionsを利用し、Step Functions側でエラーハンドリングして再試行するのが良いと提案いただきました。

これは@watta10さんの記事の図でいう突然の死に該当します。

引用: EventBridgeとECSで定時バッチ実行させるときに気をつけるメモ - Qiita

> 突然の死 <

みなさんも気をつけてくださいね。

参考

AWS Providerのドキュメントをターミナルから開くためのツールを書いた

業務でTerraformをよく使うのですが、自分が実装するとき、あるいは コードレビューするときに利用しているProviderのドキュメントを開くことが結構多いです。

もっと簡単に開くことはできないかな思い、あいまい検索してブラウザでURLを開いてくれる小さいCLIを書いてみました。

いまのところ go generateGitHub API v3の Git Trees APIからファイル名の一覧を取得し、リソース名に変換するという風に実装しています。

機会があれば 他のプロバイダーやData Sourcesなども対応しようかな〜と考えています。

GitHub - shmokmt/tf-docs-finder: This utility tool is designed to immediately open the documentation of a Terraform Provider from the command line.

AWSのインターフェース型VPCエンドポイントの注意点

注意点

インターフェース型VPCエンドポイントを作成する際に配置するサブネットを複数選択できるのですが、VPCエンドポイント経由で通信したいサブネットを全部紐付けて、 terraform apply したら下記のようなエラーが出てしまいました。

creating EC2 VPC Endpoint (com.amazonaws.ap-northeast-1.ecr.dkr): DuplicateSubnetsInSameZone: Found another VPC endpoint subnet in the availability zone of subnet-hoge. VPC endpoint subnets should be in different availability zones supported by the VPC endpoint service.

インターフェイスエンドポイントで選択できるサブネットは、アベイラビリティーゾーンあたり 1 つのみです

引用元: インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon Virtual Private Cloud

1AZにつき1つのサブネットしか紐付けられないようです。

対応

各AZにつき1つのサブネットを代表として選び、制約を満たす必要があります。 エンドポイントのプライベートDNSにルーティング可能であればどこのサブネットにVPCエンドポイントを作成しても動作するようです。 実際に検証してみましたが、動作しました。

構成としては、zennで会川さんが紹介しているようなVPCエンドポイント用のサブネットを作成するのが1番シンプルだと思います。

引用元: 同じAZ内の複数subnetからECR PrivateLinkを利用する方法

合わせて読みたい