tech.guitarrapc.cóm

Technical updates

Pulumi で既存のリソースを取り込む

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

qiita.com

前回までの記事で概ね Pulumi でかける感触が出てきたと思います。 今回から、一歩先に進めることを見ていきましょう。

まずは、既存のリソースを取り込むことです。terraform import ですね。 既存環境を Pulumi で取り込むには必須なので気になるやつです。

目次

TL;DR

pulumi でリソースを書いたときに、CustomResourceOptionsImportId を使うことで特定のリソースを取り込むことができる。

想定ケース

Pulumi でstateから特定のリソースを消す | kinoco Kibela で、Route53 のリソースをComponentResource に移動することを考えてみる。

このままでは、既存のリソースがあるのに pulumi up すると新規に作成しようとする。 Route53 は同じ名前のZoneが作れてしまうのでこのままでは困る。

$ pulumi up

     Type                       Name                                                    Plan
     pulumi:pulumi:Stack        pulumi-dev
     └─ pkg:EksClusterResource  sandbox
 +      └─ pkg:Route53Resource  sandbox-route53                                         create
 +         └─ aws:route53:Zone  sandbox-route53-zone-eks-sandbox-pulumi.my.example.com  create

Resources:
    + 2 to create

対応

ComponentResource でZoneリソースを書いたときに、CustomResourceOptions で ImportId に取り込むリソースのIDを入れる。

AWS では多くの場合、Arn や Id となり、ごくまれに name が該当する。このルールは、もちろんterraformの import に従えばいい。

例えば、Route53 Zoneなら次のようになる。

new Zone($"{name}-zone-{parameter.ZoneName}", new ZoneArgs
{
    Name = parameter.ZoneName,                
    Tags = parameter.Tags,
}, new CustomResourceOptions { Parent = this, ImportId = "ABCDE123456789" });

この状態で pulumi up で preview を見てみると、Plan が create ではなく import になっていることがわかる。

$ pulumi up

     Type                       Name                                                    Plan
     pulumi:pulumi:Stack        pulumi-dev
     └─ pkg:EksClusterResource  sandbox
 +      └─ pkg:Route53Resource  sandbox-route53                                         create
 =         └─ aws:route53:Zone  sandbox-route53-zone-eks-sandbox-pulumi.my.example.com  import

Resources:
    + 1 to create
    = 1 to import
    2 changes

この状態で一度 pulumi up を行う。

$ pulumi up

     Type                       Name                                                    Status
     pulumi:pulumi:Stack        pulumi-dev
     └─ pkg:EksClusterResource  sandbox
        └─ pkg:Route53Resource  sandbox-route53
 =         └─ aws:route53:Zone  sandbox-route53-zone-eks-sandbox-pulumi.my.example.com  imported

Outputs:
    config-active: true

Resources:
    = 1 imported

これですでに取り込みができたので、 ImportId 部分を削除する。

// before
new CustomResourceOptions { Parent = this, ImportId = "ABCDE123456789" });

// after
new CustomResourceOptions { Parent = this });

あとは普通通りに pulumi up していっても問題ない。

$ pulumi up

Resources:
    1 unchanged

REF

Programming Model - import