この記事は、Pulumi dotnet Advent Calendar 2019の14日目です。
Terraform作ったリソースだが、実際にはKubernetesやECS、Code DeployなどいろいろなAWSリソースによって値が変わるということはよくあります。 こういった場合、そのリソースの影響を受けるプロパティに発生した変更を無視するようにすることが一般的にとられています。
Pulumiも当然同じことは起こりますが、どのようにすればいいのでしょうか? 見てみましょう。
概要
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を見てリソースのプロパティを確認する必要がある。
