tech.guitarrapc.cóm

Technical updates

Pulumiでstateから特定のリソースを消す

この記事は、Pulumi dotnet Advent Calendar 2019の15日目です。

https://qiita.com/advent-calendar/2019/pulumi-dotnet

PulumiのStateから特定のリソースだけ管理対象外にしたい、そんなことはきっと起こります。 どのようにやればいいのか見てみましょう。

概要

  • pulumi state rm '<URN>'で消せる
  • URNには、$xxxxが混じるので、シングルクォートで囲っておくと安全。リソース名に$%のような特殊文字は使わないほうがよさそう
  • URNはpulumi stack --show-urnsで表示できるので、pulumi stack --show-urns | grep xxxxにすると楽

想定ケース

pulumiで、Route53をComponentResourceを使わずに組んでいた。

private Zone CreateRoute53Resource(string name, string zoneName, Dictionary<string, object> tags)
{
    var zone = new Zone($"{name}-zone-{zoneName}", new Pulumi.Aws.Route53.ZoneArgs
    {
        Name = zoneName,
        Tags = tags,
    }, new CustomResourceOptions { Parent = this });
    return zone;
}

これをグルーピングしたいので、ComponentResourceで組むようにしたい。 早速書いてみて、CreateRoute53Resourceは不要なので削除してpulumi upすると次のような実行プランになった。

     Type                       Name                                                    Plan
     pulumi:pulumi:Stack        pulumi-dev
     └─ pkg:EksClusterResource  sandbox
 +      ├─ pkg:Route53Resource  sandbox-route53                                         create
 +      │  └─ aws:route53:Zone  sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com  create
 -      └─ aws:route53:Zone     sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com  delete

deleteになっているのが、もともとあったリソース定義であるCreateRoute53Resource部分。

ここを消さないようにしたい。 (既存のリソースを取り込むのはPulumi で既存のリソースを取り込む | kinoco Kibela参照)

対応方法

pulumiのstateはpulumi stateで操作できる。特定のリソースのstateを消すなら次のコマンドになる。

pulumi state rm <URN>

この時、pulumiのリソースごとに振られた一意のID、URNが必要になる。 URNは、pulumi stack --show-urnsで一覧表示できる。

$ pulumi stack --show-urns

Current stack is dev:
    Owner: guitarrapc
    Last updated: 15 minutes ago (2019-11-19 11:21:31.7024525 +0900 JST)
    Pulumi version: v1.5.2
Current stack resources (51):
    TYPE                                                                     NAME
    pulumi:pulumi:Stack
       └─ aws:route53/zone:Zone                                              sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com
             URN: urn:pulumi:dev::pulumi::pkg:MyResource$aws:route53/zone:Zone::sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com

この例のように、リソース名とURNはセットになっているので、リソース名がわかるならそれでgrepすれば結果は絞り込める。

$ pulumi stack --show-urns | grep eks-sandbox-pulumi.my.exmple.com

URNが特定できたら、pulumi state rmで削除すればok。 注意点として、URNに$が混じっているため、シェルによっては変数扱いされたりする。そういった場合に備えてシングルクォート'で括るほうがいいだろう。

pulumi state delete 'urn:pulumi:dev::pulumi::pkg:MyResource$aws:route53/zone:Zone::sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com'

この状態でpulumi upしてみると、先ほどあったdeleteはなくなっている。

     Type                       Name                                                    Plan
     pulumi:pulumi:Stack        pulumi-dev
     └─ pkg:EksClusterResource  sandbox
 +      └─ pkg:Route53Resource  sandbox-route53                                         create
 +         └─ aws:route53:Zone  sandbox-route53-zone-eks-sandbox-pulumi.my.exmple.com  create

REF

pulumi stack rm