Terraformのリファクタリング用のブロック(moved, import, removed)をまとめて削除する
はじめに
Terraformのリファクタリングの機能として、moved
、import
、removed
などのブロックが存在しますが、terraform applyを実行すると不要になることが多いです*1。.tf
ファイル上にそのまま残しておいてもterraform planやterraform applyをする上で障壁になるわけではないですが、数がそれなりに増えると煩わしさが一定あるため、まとめて削除するコマンドラインツールを書いてみました。
作ったもの
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';
合わせて読みたい
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のドキュメントをターミナルから開くためのツールを書いた
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.
引用元: インターフェイス VPC エンドポイント (AWS PrivateLink) - Amazon Virtual Private Cloud
1AZにつき1つのサブネットしか紐付けられないようです。
対応
各AZにつき1つのサブネットを代表として選び、制約を満たす必要があります。 エンドポイントのプライベートDNSにルーティング可能であればどこのサブネットにVPCエンドポイントを作成しても動作するようです。 実際に検証してみましたが、動作しました。
構成としては、zennで会川さんが紹介しているようなVPCエンドポイント用のサブネットを作成するのが1番シンプルだと思います。
引用元: 同じAZ内の複数subnetからECR PrivateLinkを利用する方法