この記事は、Pulumi dotnet Advent Calendar 2019 の9日目です。
前回までの記事で概ね Pulumi でかける感触が出てきたと思います。 今回から、一歩先に進めることを見ていきましょう。
まずは、既存のリソースを取り込むことです。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