tech.guitarrapc.cóm

Technical updates

Pulumi でリソースのパラメーターが変化しても無視 Ignore Changes する

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

qiita.com

すでに 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:LaunchConfigurationsandbox-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 されない。

  1. リソースのプロパティ != C# Pulumi 上のプロパティ であるため、nameof(Prop) (C# なので Pascalになっている) だと IgnoreChanges されない。pulumi up や state、Web UI を見てリソースのプロパティを確認する必要がある。

REF

Pulumi - Programming Model - ignoreChanges