【Pulumi】pulumiで対象リソースのみデプロイ / 削除(--target)

■ はじめ

小ネタ。
よく使うし、今後も使いそうなので、メモ。

目次

【1】対象リソースのみデプロイ
【2】対象リソースのみ削除
【3】複数指定したい場合
【4】使用上の注意
 1)URNを引用符「'」で囲った方がいい
 2)親子関係があるリソースは親リソースを先に作る

【1】対象リソースのみデプロイ

* pulumi up --target で URN(ARN)を指定してデプロイ
* From Pulumi CLI 1.3.0

https://tech.guitarrapc.com/entry/2019/12/21/000000
https://qiita.com/ttkn9a/items/6fb71af2d265939184c3

* URN(ARN) を調べるのは、「pulumi stack --show-urns」
 => 以下のAPI仕様書を参照のこと

https://www.pulumi.com/docs/reference/cli/pulumi_stack/

★2022/08/04追記

* 新規作成AWSリソースでは、
 「pulumi stack --show-urns」では、URIが表示されないので
 「pulumi preview --diff」を使う必要がある

 => だったら、「pulumi stack --show-urns」いらないじゃんってなるが
  「pulumi preview --diff」だと情報量が多くて見づらいので
  基本は、「pulumi stack --show-urns」を使ったほうがよさそう。

 => 詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2022/08/04/124321

コマンド例

Step1: Stack を選択

# どんなStackが選択できるかを調べるには「pulumi stack ls」を実行)
pulumi stack select nonprod

Step2: URN(ARN) を調べる

pulumi stack --show-urns

# 絞り込みたい場合は、パイプ(|) & grep を利用する
# pulumi stack --show-urns | grep "<キーワード>"

Current stack is dev:
    Managed by LAPTOP-RXXXQSF6
    Last updated: 12 minutes ago (2022-03-22 23:04:57.8516092 +0900 JST)
    Pulumi version: v3.26.1
Current stack resources (5):
    TYPE                                 NAME
    pulumi:pulumi:Stack                  quickstart-dev
    │  URN: urn:pulumi:dev::quickstart::pulumi:pulumi:Stack::quickstart-dev
    ├─ demo:DemoComponent                hello-world
    │  │  URN: urn:pulumi:dev::quickstart::demo:DemoComponent::hello-world
    │  ├─ kubernetes:apps/v1:Deployment  nginx
    │  │     URN: urn:pulumi:dev::quickstart::demo:DemoComponent$kubernetes:apps/v1:Deployment::nginx
    │  └─ kubernetes:core/v1:Service     nginx
    │        URN: urn:pulumi:dev::quickstart::demo:DemoComponent$kubernetes:core/v1:Service::nginx
    └─ pulumi:providers:kubernetes       default_3_17_0
          URN: urn:pulumi:dev::quickstart::pulumi:providers:kubernetes::default_3_17_0

Current stack outputs (1):
    OUTPUT  VALUE
    ip      10.106.169.203

Step3: --target を指定して実行

# 構文:pulumi up --target '<URN>'
pulumi up --target 'urn:pulumi:dev::quickstart::demo:DemoComponent::hello-world'

# 不安な場合は、pulumi preview --target '<URN>' で実行

【2】対象リソースのみ削除

* pulumi up の 「補足:対象リソースのみデプロイ(--target)」
 の逆バージョンで pulumi destroy --targetを実行する

コマンド例

# xxxxxx は対象のURN
pulumi destroy --target 'xxxxxx'

【3】複数指定したい場合

# --target 'xxx' --target 'yyyy' ... で連結させればいい
pulumi up \
--target 'urn:pulumi:dev::quickstart::demo:DemoComp::hello-world1' \
--target 'urn:pulumi:dev::quickstart::demo:DemoComp::hello-world2' \
--target 'urn:pulumi:dev::quickstart::demo:DemoComp::hello-world3'

【4】使用上の注意

1)URNを引用符「'」で囲った方がいい

# URNに「$」など記号が入っている
$ pulumi up --target urn:xxxxx...$aws:xxx

エラー内容

error: Target 'urn:xxxxx...$aws:xxx' could not be found in the stack.
Did you forget to escape $ in your shell

対応案

# <URN>を引用符「'」で囲った
$ pulumi up --target 'urn:xxxxx...$aws:xxx'

別案

# \でエスケープする(「\$」部分)
$ pulumi up --target 'urn:xxxxx...\$aws:xxx'

2)親子関係があるリソースは親リソースを先に作る

* 親子関係があるリソースは親リソースを先に作る必要があるので
 ちゃんとリソースの作りを知っておかないといけない。
 => 以下の関連記事のようなことが発生するかも、、、

pulumi up --target をした際にエラー「snapshot integrity failure」が発生
https://dk521123.hatenablog.com/entry/2022/09/27/165923

関連記事

Pulumi ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/10/23/025230
Pulumi ~ 基本編 / CLI
https://dk521123.hatenablog.com/entry/2021/10/25/215508
pulumiで 新規作成リソースのみデプロイ
https://dk521123.hatenablog.com/entry/2022/08/04/124321
pulumi up --target をした際にエラー「snapshot integrity failure」が発生
https://dk521123.hatenablog.com/entry/2022/09/27/165923