この記事は、Pulumi dotnet Advent Calendar 2019の15日目です。
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