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