tech.guitarrapc.cóm

Technical updates

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

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

qiita.com

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

まずは、既存のリソースを取り込むことです。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