TerraformでAWSリソースを作成するときの定番がデフォルトタグです。Pulumiでもデフォルトタグを設定できるようになったのでメモです。
デフォルトタグは便利というレベルじゃない
デフォルトタグはAWSリソースを作成するときに、リソース個別にタグをつけなくても自動でタグを付けてくれる機能です。TerraformでAWSリソースを作成するときには、デフォルトタグを設定することが定番です。
provider "aws" { region = "ap-northeast-1" default_tags { tags = { environment = "dev" managedBy = "terraform" project = "foobar" } } }
デフォルトタグがないとリソース単位にタグを渡すことになるのですが、リソースによってはタグが設定できなかったりするので「もれなく設定する」のは難易度が高いです。 そんな訳で、実務で考えるとデフォルトタグは便利というレベルではなく、正しくないと仕事になりません。
Pulumiのデフォルトタグはこれまで面倒だった
PulumiはTerraformのようにデフォルトタグを設定できます。ただし、これまでのPulumiのデフォルトタグはProviderを明示的に作る必要がありました。APIはTerraformとほぼ同じなのですが、PulumiのProviderはデフォルトリージョンのものは作成せずとも利用できちゃうので、デフォルトタグを設定するためだけにProviderを作るのは面倒でした。1
using Pulumi; using Pulumi.Aws; return await Pulumi.Deployment.RunAsync(() => { new Provider("default", new() { DefaultTags = new Pulumi.Aws.Inputs.ProviderDefaultTagsArgs { Tags = new InputMap<string> { { "environment", "dev" }, { "managedBy", "terraform" }, { "project", "foobar" }, } }, }); });
Pulumiのスタックコンフィグでデフォルトタグを設定する
Pulumiのデフォルトタグはpulumi.<スタック名>.yaml
でも設定できます。こちらを使うと、Providerを作らなくてもデフォルトタグを設定できます。
ただし、Providerを作るときと違って静的な設定になるため、ダイナミックに実行時の情報でタグを帰るみたいな運用には向きません。2
この設定をするだけでリージョンが複数あってProviderを作ることがあっても、自動的にデフォルトタグが利用されます。最高。
# 例えばdevスタックなら pulumi.dev.yaml を触る config: aws:region: ap-northeast-1 aws:defaultTags: tags: environment: dev managedBy: terraform project: foobar
まとめ
PulumiはProviderでしかデフォルトタグ設定できない期間が長かったのですが、今はスタックコンフィグで設定できるので切り替えていくといいでしょう。 なお、この設定がドキュメントから理解するのは難易度高いということでIssueが立っています。それは本当にそう。