この記事は、Pulumi dotnet Advent Calendar 2019 の14日目です。
すでに Pulumi で扱うこと自体はなるほど、という感じになってきましたでしょうか。 完全に理解した() を目指して、さらに進めてみます。
Terraform 作ったリソースだが、実際には Kubernetes や ECS、Code Deploy などいろいろな AWS リソースによって値が変わるということはよくあります。 こういった場合、そのリソースの影響を受けるプロパティに発生した変更を無視するようにすることが一般的にとられています。
Pulumi も当然同じことは起こりますが、どのようにすればいいのでしょうか? 見てみましょう。
目次
TL;DR
dotnet では、CustomResourceOptions.IgnoreChanges
でプロパティを指定すればいいとあるが、実際は dotnet のプロパティではなくリソースのプロパティなので大文字/小文字など、実リソースとdotnet プロパティの言葉の差異に気を付けること。
つまり、 nameof(Property)
は使えない。
基本
ResourceOption
あるいは CustomResourceOption
で IgnoreChanges プロパティに無視したいリソースのプロパティを指定する。
// Changes to the value of `prop` will not lead to updates/replacements var res = new MyResource("res", new MyResourceArgs { prop = "new-value" }, new ResourceOptions { IgnoreChanges = { "prop" } });
リソースのプロパティ名を確認する
pulumi up
をしたときに差分が表示されるが、[diff: ~propertyName]
にある ~
以降の文字列がリソースのプロパティとなる。
このプロパティ文字列を、CustomResourceOptions.IgnoreChanges
プロパティで指定することで、IgnoreChanges が機能するようになる。
例
例えば、aws:ec2:LaunchConfiguration
の sandbox-asg-autoscale-lc
リソースで ami id が変わっても無視したい場合を考える。
ami id が変わると、場合によっては ami のバグを踏んでしまう可能性があるため安定した ami id を都度指定したいなどの要求
pulumi up
をした状態では次のように表示される。
$ pulumi up Previewing update (dev): Type Name Plan Info pulumi:pulumi:Stack pulumi-dev 'dotnet build -nologo .' completed successfully ������ pulumi:pulumi:Stack pulumi-dev 2 messages ��������� Name Plan Info └─ pkg:component:ekscluster sandbox └─ pkg:component:autoscaling sandbox-asg +- ├─ aws:ec2:LaunchConfiguration sandbox-asg-autoscale-lc replace [diff: ~imageId] ~ └─ aws:autoscaling:Group sandbox-asg-autoscale-asg update [diff: ~launchConfiguration]
注目するのはこのライン
+- ├─ aws:ec2:LaunchConfiguration sandbox-asg-autoscale-lc replace [diff: ~imageId]
[diff: ~propertyName]
に注目すると、imageId
がリソースのプロパティとわかる。
C# コード上で、Pulumi リソースで CustomResourceOptions
を渡すときに、IgnoreChanges にこの文字列を含める。
new LaunchConfiguration("sandbox-asg-autoscale-lc", new LaunchConfigurationArgs{ // いろいろ定義 }, new CustomResourceOptions { Parent = this, IgnoreChanges = new List<string> { "imageId" } });
再度 pulumi up
をすると、IgnoreChanges で指定した通り、ami id の変化が無視されるようになる。
$ pulumi up Previewing update (dev): Type Name Plan Info pulumi:pulumi:Stack pulumi-dev 'dotnet build -nologo .' completed successfully pulumi:pulumi:Stack pulumi-dev 2 messages Type Name Plan Info Diagnostics: pulumi:pulumi:Stack (pulumi-dev): Resources: 57 unchanged
トラブルシュート
Q. IgnoreChanges に、nameof(Prop)
と指定したが IgnoreChanges されない。
リソースのプロパティ != C# Pulumi 上のプロパティ
であるため、nameof(Prop)
(C# なので Pascalになっている) だと IgnoreChanges されない。pulumi up や state、Web UI を見てリソースのプロパティを確認する必要がある。