この記事は、Pulumi dotnet Advent Calendar 2019の9日目です。
前回までの記事でPulumiを使ってIaCできる感触が出てきました。 今回から、一歩先に進めることを見ていきましょう。
まずは、既存のリソースを取り込むことです。terraform importですね。
既存環境をPulumiで取り込むには必須なので気になるやつです。
概要
pulumiでリソースを書いたときに、CustomResourceOptionsでImportIdを使うことで特定のリソースを取り込むことができる。
想定ケース
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