tech.guitarrapc.cóm

Technical updates

ローカルPulumi ProjectとアカウントPulumi Project の紐づけ

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

qiita.com

あまりないのですが、時にすでにある Project と ローカルのpulumi を紐づけたいときがあります。

そんなときにどうやればいいのか見ておきます。

目次

TL;DR

  • アカウントの Projectとの紐づけは、Pulumi.yaml で行っている
  • pulumi up したディレクトリと同一名のstackがあればそれをつかい、なければ聞かれるのでそこで紐づける

Summary

Pulumi は、 Project - Stack という構造で組まれています。 アカウントは複数の Project を持つことができ、Project は複数の Stack を持つことができます。

そのため、手元のプロジェクトを、他のプロジェクトやStack と紐づけたい場合には、そのプロジェクトで明示したり、 pulumi up 時にstackの選択/stackの作成をする必要があります。

Pulumi Project の紐づけ

ローカルのPulumi 定義を見てみると、Pulumi.yamlPulumi.STACKNAME.yaml があることがわかります。

このうち、Pulumi Project と現在のPulumi定義の紐づけを行っているのが、Pulumi.yaml です。

例えば、Project名にaws-sandbox、ランタイムに C#、概要を AWS サンドボックスのプロジェクトであることを明示するなら次のようになります。

name: aws-sandbox
runtime: dotnet
description: AWS Sandbox Project

このYAMLが定義の元であるため、Web上の表示は YAML の内容で表示されます。 表示の更新タイミングは、pulumi up 時です。

Pulumi Stack の紐づけ

Stack は、具体的な定義ファイルで紐づいていません。 Web上に State を持っているので、手元のプロジェクトを pulumi uppulumi stack select で紐づけるだけです。

ローカルのPulumi定義とWebを紐づけるのは、config ファイルで、Pulumi.STACKNAME.yaml というルールで存在します。

例えば、awsのregionがap-northeast-1 であるStack ekscluster があるなら次のようなYAMLファイルがあるでしょう。

config:
  aws:region: ap-northeast-1

Pulumi で特定のリソースのみUpdateやDestroyする

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

qiita.com

Pulumi で terraform target のような操作をどうやるか見てみます。

目次

TL;DR

Pulumi CLI 1.3.0 から --target によって可能になった。

合わせて replace により入れ替えや、明示的な依存指示もサポートされている

--replace stringArray          Specify resources to replace. Multiple resources can be specified using --replace run1 --replace urn2
-t, --target stringArray           Specify a single resource URN to update. Other resources will not be updated. Multiple resources can be specified using --target urn1 --target urn2
--target-dependents            Allows updating of dependent targets discovered but not specified in --target list
--target-replace stringArray   Specify a single resource URN to replace. Other resources will not be updated. Shorthand for --target urn --replace urn.

実際に操作する

URN を調べる。

pulumi stack --show-urns

あとはURN を指定する。

pulumi up --target URN

DotNetCliToolReference から .NET Core Local Tools へ移行する

前回、.NET Core Tools と DotNetCliToolReference についてみてみました。

tech.guitarrapc.com

DotNetCliToolReference がオワコンということで、.NET Core Local Tools に移行しないと、ということもあるわけでどのようにやったかを残しておきます。

目次

TL;DR

  • .NET Core 3.1 からはDotNetCliToolReference を .NET Core Local Tools へ移行が必要
  • .NET Global Tools に公開してあるパッケージなら支障なく移行できる
  • 実行タイミングなどのTarget は今まで通りでok

Step by Step

都合により、.NET Framework 4.6 で組んでいたプロジェクトを .NET Core 3.1 プロジェクトに変更する流れで見ていきます。

net46 参照でも、SDK Style な csproj であれば DotNetCliToolReference は利用できます。

Before & After

もともと DotNetCliToolReference を使っていたプロジェクトを、.NET Core Local Tools に移行してみます。

Before

DotCliToolReference で参照していた dotnet-kustomizationconfigmapgenerator-project-tool をやめます。

NuGet Gallery | dotnet-kustomizationconfigmapgenerator-project-tool 0.2.1

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
  </PropertyGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-kustomizationconfigmapgenerator-project-tool" Version="0.2.1" />
  </ItemGroup>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="dotnet kustomizationconfigmapgenerator" />
  </Target>

</Project>

After

.NET Tool として公開している .NET Core Tools のKustomizeConfigMapGenerator に切り替えます。

NuGet Gallery | KustomizeConfigMapGenerator 0.2.1

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
  </PropertyGroup>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="dotnet tool restore" />
    <Exec Command="dotnet tool run dotnet-kustomizeconfigmapgenerator" />
  </Target>

</Project>

Step1. DotNetCliToolReference を外す

DotNetCliToolReference は Visual Studio などのUIからは操作できません。 .csproj を直接触ってDotNetCliToolReference の参照を消しましょう。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net46</TargetFramework>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
  </PropertyGroup>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="dotnet kustomizationconfigmapgenerator" />
  </Target>

</Project>

Step2. .NET Core 3.1に変更する

TargetFramework を net46 から netcoreapp3.1 に変更します。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
  </PropertyGroup>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="dotnet kustomizationconfigmapgenerator" />
  </Target>

</Project>

Step3. .NET Core Local Tool のマニフェストを生成する

.NET Core Local Tools は、.csproj ではなく自分のマニフェストで管理されます。

マニフェストを、.NET Core 3.1 SDK で実行できる dotnet new tool-manifest で生成します。

dotnet new tool-manifest

Step4. ツールの参照を追加

.NET Core Local Tools は、.NET Global Tools で配布しているパッケージを追加できます。

dotnet-kustomizationconfigmapgenerator-project-tool は DotNetCliToolReference 専用の nuget パッケージでしたが、.NET Tool として公開している KustomizeConfigMapGenerator に変更します。

dotnet tool install KustomizeConfigMapGenerator

これで .config/dotnet-tools.jsonKustomizeConfigMapGenerator が追記されました。

{
  "version": 1,
  "isRoot": true,
  "tools": {
    "kustomizeconfigmapgenerator": {
      "version": "0.2.1",
      "commands": [
        "dotnet-kustomizeconfigmapgenerator"
      ]
    }
  }
}

Step5. ビルド前処理に差し込みます

.NET Local Tools を任意のビルドターゲットで実行します。

TIPS: 実行前に必ず dotnet tool restore を行います。

例えばビルド前 BeforeBuild に行いたいならこうでしょう。(PreBuild ターゲットもありです)

<Target Name="Your_Task" BeforeTargets="BeforeBuild">
    <Exec Command="dotnet tool restore" />
    <Exec Command="dotnet tool run dotnet-kustomizeconfigmapgenerator" />
</Target>

うまく実行できればあとはいい感じで引数を渡せばいいでしょう。

TIPS

複数の実行処理をTaskに定義したい

.NET Core Local Tools のTIPS ではないのですが、ターゲットの中で複数行にわたる処理を書きたい場合は、複数 Exec にすると見やすいです。 上からシーケンシャルに実行されることが保証されているのでシンプルでいいでしょう。

↑の例はそうですね。

Exec 内で処理が完結するなら見やすくなります。

指定したバージョンのNuGetパッケージが見つからないケース

dotnet tool install 後に、バージョンを更新した、ということで手で dotnet-tools.json を書き換えた場合、そのバージョンのNuGet パッケージがあるか保証されません。

もし放流直後だと、まだ NuGet Feed にはListingされてないことがあります。

そうすると以下のエラーが出るので、出たらパッケージがあるか確認するといいでしょう。

もう push したと思っても、NuGet にはまだ index されていないと出ています。

This package has not been indexed yet. It will appear in search results and will be available for install/restore after indexing is complete.

DisableFastUpToDateCheck は何

Visual Studio は、ファイル更新がない場合ビルドをスキップします。 このプロパティを有効にすると、ファイル更新の有無にかかわらず ビルド処理まで進んで dotnet cli / msbuild に再ビルドするかを任せます。

つまり、.NET Core Tools などで常にビルド前に処理を挟みたいときはこのプロパティを使うといい感じです。

.NET Core の決定的ビルドと組み合わさることでこれがいい感じになるのですが、詳細はまた別の機会に。

REF

.NET Core ツールの使用に関する問題のトラブルシューティング - .NET Core CLI | Microsoft Docs

New in .NET Core 3.0: local tools: Exploring ASP.NET Core 3.0 - Part 7

.NET Core 3 Local Tools

.NET Core Tools と DotNetCliToolReference

.NET Core 3.1 がリリースされました、LTS リリースなので netcoreapp3.0 にしていたものは悉く netcoreapp3.1 に移行ですね。

さて、C# 的には .NET Core 3.0 から変化がほぼないのですが、dotnet cli や ビルド的には.NET Core 2.2から破壊的変更が行われました。 .NET Core Local Tools です。

今回は、これまでもあった .NET Core Global Tools と、.NET Core 2.2 までの DotNetCliToolReference、.NET Core 3.1からの .NET Core Local Toolsについてです。

これまでも書こうと思ってたのですが、ちょっとながしてたやつ。

目次

TL;DR

  • ツールに対して一意のバージョンでCLIを使うなら .NET Core Global Tool でok
  • プロジェクトごとにバージョン使い分けたりプロジェクトに紐づけるなら、DotNetCliToolReference or .NET Core Local Tools を使う
  • DotNetCliToolReference は.NET Core 2.2 and below に限定されてオワコン
  • .NET Core 3.1 以上では、.NET Core Local Tools に移行必須
  • .NET Core Local Tools では dotnet tool restore を忘れないで
  • Manifest の二重管理の世界へようこそ

Summary

.NET Core 2.2 まで

  • マシンで一意に使う CLI : .NET Core Global Tools
  • プロジェクト固有に利用する CLI (csproj単位) : DotNetCliToolReference

.NET Core 3.0 以降

  • マシンで一意に使うCLI : .NET Core Global Tools
  • プロジェクト固有に利用する CLI (sln/csproj単位) : .NET Core Local Tools

.NET Core Global Tools (> .NETCore 2.1)

.NET Core で大きく変わった体験の1つが.NET Core Global Tool です。 コンセプトとして NPM global tools を意識しているだけあり、npm に相当するnuget にアップロードしたコンソールアプリケーションを dotnet CLI から取得して、パスを意識することなく利用できます。

Announcing .NET Core 2.1 Preview 1 | .NET Blog

# npm
$ npm install -g TOOL

# .NET Global Tools
$ dotnet install tool -g TOOL

これを使うことで、.NET Core製のCLIの配布が dotnet cli で行えるようになり、.NET Core SDK が入っている環境でのツール配布が一元化、簡略化され、利用者も.NET Core SDK が入っていればok になりました。 日常的な開発体験もそうですが、ちょっとしたツールの展開、CI/CDでのツール利用まで大きく簡略化されています。

何よりも、.NET Core をターゲットに作ることでマルチプラットフォームで利用できるツールをサクッと作って配布できるようになったのが .NET Core Tools の嬉しいことです。

.NET Core Global Tools以前のCLI配布

各人がGitHub Release や 直バイナリなどで配布、利用者はダウンロードしてパスを通して利用。

.NET Core Global Tools以降のCLI配布

NuGet にpackしてpush すれば配布はNuGet任せ。利用者はパスが通った箇所にツールがインストールされるのでCLIをインストール後は実行するだけ。

.NET Core Global Tools で満たされるケース

大概のケースではうまく機能するはずです。 唯一の前提は1つです。(.NET Core SDK は大前提なので含みません)

  • 通常のCLI利用として、ツールごとに一意のバージョンでよい

.NET Core Global Tools で困るケース

一方で、NPM global tools がそうであるように、.NET Core Global Toolsではツールごとに一意のバージョン参照になるという制約は当然あります。

.NET Core Global Tools を各自がインストールすればいいように見えますね。ダメなんでしょうか?

.NET Core Global Tools を使うと、複数のプロジェクトで個別のバージョンでツールを使いたいときに不自由します。 特にそういうケースは、マルチプラットフォームに csproj のビルド後イベントで何かを実行したいときに生じます。

こういうビルド後処理はシンプルなことが多くコマンド1つで行けたりするので、シェルを適当にたたきたいところですが、マルチプラットフォームが前提だと案外困ります。

  • Bash だとWindows で困る
  • BatはWindowsでない環境で困る
  • PowerShell は非Windowsでインストールされてないと困る

どれもそのプラットフォームに閉じればいいのですが、各人の開発環境やCI環境など実行個所を選ばない前提に立つと微妙に選択肢に困ります。

こういったときに.NET Core Global Tools は、.NET Core SDK が入っていればok なので .NET Core 開発環境、ビルド環境で利用するのに支障がないように見えます。 マルチプラットフォームに動作が保証されて導入も楽なのでいい感じに思えるのですが、前述の通りプロジェクトごとに個別のバージョンを利用したいときに困ります。 いちいちプロジェクトごとに、ツールのバージョンを変えるということはしたくないのです。

プロジェクト固有のCLI参照

.NET Core 2.2 までと、.NET Core 3.1 以降で方法が変わります。

DotNetCliToolReference (< .NETCore 2.2)

プロジェクトに固有で.NET CoreなCLIを利用したい、それを満たすために用意されていたのが DotNetCliToolReference です。

# Consuming per-project tools

Consuming these tools requires you to add a <DotNetCliToolReference> element to your project file for each tool you want to use. Inside the <DotNetCliToolReference> element, you reference the package in which the tool resides and specify the version you need. After running dotnet restore, the tool and its dependencies are restored.

.NET Core CLI extensibility model - .NET Core CLI | Microsoft Docs

DotNetCliToolReference を利用するには、SDK Styleの .csproj でNuGet に放流したパッケージを<DotNetCliToolReference> で参照すると (.NET Core Tools とは違う通常のNuGet パッケージ)、プロジェクトのビルド処理で利用できるものです。 dotnet restore でnuget パッケージと同様に復元されるので、.csprojに定義を追加してコミットすれば意識するなく利用できます。

PackageReference と同様に属性を定義ができるので、バージョンも固定もできるしプロジェクト固有のCLI処理だけ考えると概ね満たされます。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <!-- The tools reference -->
  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-api-search" Version="1.0.0" />
  </ItemGroup>
</Project>

.NET Core なプロジェクトでなくとも、SDK Style の csproj であれば .NET Framework 4.6 でも利用できるので案外使いどころはあります。

DotNetCliToolReference に対応した NuGetパッケージの作成、配布

難点として、配布側が少しだけ面倒です。 DotNetCliToolReference は、.NET Core Tools ではなく NuGet パッケージであるため、配布側は .NET Core Tools とは別に NuGetパッケージを作成する必要があります。CLIの処理的には何も変わらないので、同じコードのまま .csproj を変えて参照するだけです。

csproj としては2点だけ注意が要ります。

  • PackageType を DotNetCliTool にすること
  • PackageId と AssemblyName を合わせて、dotnet- の prefix で始めるように命名する

ほぼほぼ .NET Core Global Tools と違わないので、むむっという感じでしょう。

サンプルに実際にDotNetCliToolReference として配布している NuGetパッケージ dotnet-kustomizationconfigmapgenerator の .csproj を示します。

guitarrapc/KustomizeConfigMapGenerator: Kustomize ConfigMapGenerator Generator CLI

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <Version>0.1.0</Version>
    <AssemblyVersion>$(Version)</AssemblyVersion>
  </PropertyGroup>

  <!-- nuget -->
  <PropertyGroup>
    <PackageType>DotNetCliTool</PackageType>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
    <RootNamespace>KustomizeConfigMapGenerator.ProjectTool</RootNamespace>
    <AssemblyName>dotnet-kustomizationconfigmapgenerator</AssemblyName>
    <PackageId>dotnet-kustomizationconfigmapgenerator-project-tool</PackageId>
    <Description>
      <![CDATA[Project-installable Kustomize configMapGenerator commandline tool.
This package can be installed into a project using `DotNetCliToolReference`.
* To install as a dotnet global or local tool, use `dotnet-kustomizeconfigmapgenerator` instead.]]>
    </Description>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MicroBatchFramework" Version="1.6.0" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="..\KustomizeConfigMapGenerator\**\*.cs" Exclude="..\KustomizeConfigMapGenerator\obj\**\*.cs"/>
  </ItemGroup>

  <ItemGroup>
    <None Include="..\..\LICENSE.md">
      <Pack>True</Pack>
      <PackagePath></PackagePath>
    </None>
  </ItemGroup>

</Project>

DotNetCliToolReference で困るケース

利用する分には概ねありません。

プロジェクトごとの参照になるため、ソリューション単位で必要な場合には各プロジェクトで埋め込みが必要になるでしょう。

何より DotNetCliToolReference は .NET Core 2.2 までのサポートです。.NET Core 3.1 以降では、次に述べる .NET Core Lobal Tools を使う必要があります。

Limit DotNetCliToolReference Tools to .NET Core 2.2 and Below · Issue #107 · dotnet/announcements

.NET Core Tools (> .NETCore 2.1)

.NET Core Global Tools では、 dotnet tool install -g Tool-g を付けていました。-g を外して、パスを指定することで、グローバルではなく指定したパスにツールをインストールして利用できます。

# インストール
$ dotnet tool install --tool-path .tools Cake.Tool

# 利用
$ ./.tools/dotnet-cake --help

これなら、プロジェクトごとにツールを利用できそうです。

パスを指定した .NET Core Tools のインストールで困ること

何もツールとしてはサポートがないので、あると便利な機能がありません。

  • インストールパスが決まっていないので、何をインストールしたのか一覧をとるコマンドサポートがなく利用する際に困る
  • 相対パスでインストールする前提だと、ほかのプロジェクトでも同じツールを使いたい場合でも、コピーを作ることになる。この例なら ./tools
  • マルチプラットフォームで利用を想定するとツールの起動パスは ./ で開始するでしょう。すると pwsh や bash (そのほか) に利用が制限されます。cmd ではこのパスしてはエラーなのはわかっていても、使う側からするとちょっと悩ましい

どれも些細ですが、微妙に使い勝手も困ります。

もう少し、ツールをバージョンごとに指定して利用できる仕組みがないでしょうか。

.NET Core Local Tools (> .NETCore 3.1)

.NET Core 3.1 で、Global Tools のようですが所定のパスにツールをインストールし解決する仕組みが追加されました。 これを .NET Core Local Tools といいます。

https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#local-tools

使うプロジェクトやソリューションで、dotnet new tool-manifest を実行します。

dotnet new tool-manifest

すると、.config/dotnet-tools.json が生成されます。

ls .config

.NET Core Tools で配布している中から、使いたいツールを追加します。

dotnet tool install KustomizeConfigMapGenerator

ツールが追加されたことが json でわかります。

{
  "version": 1,
  "isRoot": true,
  "tools": {
    "kustomizeconfigmapgenerator": {
      "version": "0.2.1",
      "commands": [
        "dotnet-kustomizeconfigmapgenerator"
      ]
    }
  }
}

コマンドでも取得できます。

$ dotnet tool list

dotnet tool list
パッケージ ID                         バージョン      コマンド                                    マニフェスト          
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
kustomizeconfigmapgenerator      0.2.1      dotnet-kustomizeconfigmapgenerator      C:\git\ConsoleApplication100\.config\dotnet-tools.json

ビルドイベントに仕掛けてみましょう。

dotnet tool restore
dotnet tool run dotnet-kustomizeconfigmapgenerator

実行前に dotnet tool restore でリストアを忘れないようにします。リストア時に、実行できるコマンドが表示されるので親切です。

$ dotnet tool restore

Tool 'kustomizeconfigmapgenerator' (version '0.2.1') was restored. Available commands: dotnet-kustomizeconfigmapgenerator

CLI から実行するときも、dotnet tool run dotnet-kustomizeconfigmapgenerator で実行できます。

dotnet-tools.json マニフェストの解決順は次の通りです。

  1. 現在のパスの .config フォルダー ./.config/dotnet-tools.json
  2. 現在のフォルダー./dotnet-tools.json
  3. 親フォルダー ../dotnet-tools.json
  4. ルートにたどり着くまでの親フォルダを順次

REF

What's new in .NET Core 3.0 | Microsoft Docs

.NET Core ツールの使用に関する問題のトラブルシューティング - .NET Core CLI | Microsoft Docs

Local Tools Early Preview Documentation · Issue #10288 · dotnet/cli

Limit DotNetCliToolReference Tools to .NET Core 2.2 and Below · Issue #3115 · dotnet/sdk

.NET ローカル ツールの使い方 - Qiita

pulumi up で変化するリソースの内容を確認する

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

qiita.com

些末なコマンドメモです。 Terraformと違って細かい差分でないのですが、Continuous Delivery していると details を忘れるアレ。

目次

TL;DR

pulumi up 後の選択肢で、details を選べばリソースの詳細が表示される。

Summary

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]

Diagnostics:
  pulumi:pulumi:Stack (pulumi-dev):

Resources:
    ~ 1 to update
    +-1 to replace
    2 changes. 55 unchanged

Do you want to perform this update?
  yes
> no
  details

このリソースの変化を見るには、details を選ぶといい。

Do you want to perform this update? details
  pulumi:pulumi:Stack: (same)
    [urn=urn:pulumi:dev::pulumi::pulumi:pulumi:Stack::pulumi-dev]
            ++aws:ec2/launchConfiguration:LaunchConfiguration: (create-replacement)
                [id=sandbox-plumi-cluster20191119190921211300000001]
                [urn=urn:pulumi:dev::pulumi::pkg:component:ekscluster$pkg:component:autoscaling$aws:ec2/launchConfiguration:LaunchConfiguration::sandbox-asg-autoscale-lc]
                [provider=urn:pulumi:dev::pulumi::pulumi:providers:aws::default_1_9_0_alpha_1573920297_g8292aa92::36586a29-3f5b-435f-a618-2e3ec6c62be8]
              ~ imageId: "ami-02e124a380df41614" => "ami-0b60cbd90564dfe00"
            +-aws:ec2/launchConfiguration:LaunchConfiguration: (replace)
                [id=sandbox-plumi-cluster20191119190921211300000001]
                [urn=urn:pulumi:dev::pulumi::pkg:component:ekscluster$pkg:component:autoscaling$aws:ec2/launchConfiguration:LaunchConfiguration::sandbox-asg-autoscale-lc]
                [provider=urn:pulumi:dev::pulumi::pulumi:providers:aws::default_1_9_0_alpha_1573920297_g8292aa92::36586a29-3f5b-435f-a618-2e3ec6c62be8]
              ~ imageId: "ami-02e124a380df41614" => "ami-0b60cbd90564dfe00"
            ~ aws:autoscaling/group:Group: (update)
                [id=sandbox-asg-autoscale-asg-cb81c3d]
                [urn=urn:pulumi:dev::pulumi::pkg:component:ekscluster$pkg:component:autoscaling$aws:autoscaling/group:Group::sandbox-asg-autoscale-asg]
                [provider=urn:pulumi:dev::pulumi::pulumi:providers:aws::default_1_9_0_alpha_1573920297_g8292aa92::36586a29-3f5b-435f-a618-2e3ec6c62be8]
              ~ launchConfiguration: "sandbox-plumi-cluster20191119190921211300000001" => output<string>
            --aws:ec2/launchConfiguration:LaunchConfiguration: (delete-replaced)
                [id=sandbox-plumi-cluster20191119190921211300000001]
                [urn=urn:pulumi:dev::pulumi::pkg:component:ekscluster$pkg:component:autoscaling$aws:ec2/launchConfiguration:LaunchConfiguration::sandbox-asg-autoscale-lc]
                [provider=urn:pulumi:dev::pulumi::pulumi:providers:aws::default_1_9_0_alpha_1573920297_g8292aa92::36586a29-3f5b-435f-a618-2e3ec6c62be8]

Do you want to perform this update?
  yes
> no
  details

今回の例では、LaunchConfiguration のami id が変わっているため、差し替えになる。 また、LaunchConfiguration の変化に伴って、AutoScalingGroup も更新が必要になっていることがわかる。