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