tech.guitarrapc.cóm

Technical updates

PulumiでAWSリソースのデフォルトタグを設定する

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が立っています。それは本当にそう。

参考


  1. ステートにもProviderが保持されるので、Providerは作らないほうが運用上やりやすいというのもあります。
  2. デフォルトタグを静的にできなかったことがないので、私は静的な設定を利用しています。