
既存の AWS リソースを途中から Pulumi で管理する場合はインポートできる👌
Pulumi のインポート方法は大きく「import コマンド」と「import リソースオプション」の2種類ある.詳しくはドキュメントに載っている.あくまでイメージだけど Terraform の import コマンドと import ブロックの関係に似てるとも言えそう.
1. import コマンドを試す
まず AWS CLI で Amazon CloudWatch Logs ロググループ sandbox-pulumi-import-cli を作っておく.ログクラスは Infrequent Access・保持期間は 90日 にしておく.
$ aws logs create-log-group --log-group-name sandbox-pulumi-import-cli --log-group-class INFREQUENT_ACCESS $ aws logs put-retention-policy --log-group-name sandbox-pulumi-import-cli --retention-in-days 90 $ aws logs describe-log-groups --log-group-name-prefix sandbox-pulumi-import-cli { "logGroups": [ { "logGroupName": "sandbox-pulumi-import-cli", "creationTime": 1758519450411, "retentionInDays": 90, "metricFilterCount": 0, "arn": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-pulumi-import-cli:*", "storedBytes": 0, "logGroupClass": "INFREQUENT_ACCESS", "logGroupArn": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-pulumi-import-cli" } ] }
ここで pulumi import コマンドを実行する.pulumi import コマンドの指定方法はドキュメントに載っている📝
するとプレビュー時に 1 to import・デプロイ時に 1 imported と表示された❗️そしてインポートしたリソースには protect 設定(誤って削除されないように保護できる)が付いているという注意コメントと Pulumi コードも出力される \( 'ω')/
$ pulumi import aws:cloudwatch/logGroup:LogGroup sandbox-pulumi-import-cli sandbox-pulumi-import-cli Previewing import (dev) Type Name Plan pulumi:pulumi:Stack sandbox-pulumi-aws-dev = └─ aws:cloudwatch:LogGroup sandbox-pulumi-import-cli import Resources: = 1 to import 2 unchanged Do you want to perform this import? yes Importing (dev) Type Name Status pulumi:pulumi:Stack sandbox-pulumi-aws-dev = └─ aws:cloudwatch:LogGroup sandbox-pulumi-import-cli imported (0.26s) Resources: = 1 imported 2 unchanged Duration: 2s Please copy the following code into your Pulumi application. Not doing so will cause Pulumi to report that an update will happen on the next update command. Please note that the imported resources are marked as protected. To destroy them you will need to remove the `protect` option and run `pulumi update` *before* the destroy will take effect. import * as pulumi from "@pulumi/pulumi"; import * as aws from "@pulumi/aws"; const sandbox_pulumi_import_cli = new aws.cloudwatch.LogGroup("sandbox-pulumi-import-cli", { logGroupClass: "INFREQUENT_ACCESS", name: "sandbox-pulumi-import-cli", region: "ap-northeast-1", retentionInDays: 90, }, { protect: true, });
pulumi import コマンドを実行したタイミングでインポート対象リソース(今回で言うと Amazon CloudWatch Logs ロググループ)は Pulumi 側に登録されている👌ちなみに protect 設定を意味する鍵マークにカーソルを合わせると Resource is protected from accidental deletion と表示される🔒️

あとは出力された Pulumi コードを追加して pulumi preview コマンドを実行すれば差分なし❗️
$ pulumi preview Previewing update (dev) Type Name Plan pulumi:pulumi:Stack sandbox-pulumi-aws-dev Resources: 3 unchanged
最後にインポートした Amazon CloudWatch Logs ロググループ sandbox-pulumi-import-cli の設定変更を試す.保持期間を 180日 に変更する.
const sandbox_pulumi_import_cli = new aws.cloudwatch.LogGroup("sandbox-pulumi-import-cli", { logGroupClass: "INFREQUENT_ACCESS", name: "sandbox-pulumi-import-cli", region: "ap-northeast-1", retentionInDays: 180, }, { protect: true, });
pulumi up コマンド実行して期待通りに変更できていた👌

2. import リソースオプションを試す
同じく AWS CLI で Amazon CloudWatch Logs ロググループ sandbox-pulumi-import-option を作っておく.ログクラスは Infrequent Access・保持期間は 90日 にしておく.
$ aws logs create-log-group --log-group-name sandbox-pulumi-import-option --log-group-class INFREQUENT_ACCESS $ aws logs put-retention-policy --log-group-name sandbox-pulumi-import-option --retention-in-days 90 $ aws logs describe-log-groups --log-group-name-prefix sandbox-pulumi-import-option { "logGroups": [ { "logGroupName": "sandbox-pulumi-import-option", "creationTime": 1758545230909, "retentionInDays": 90, "metricFilterCount": 0, "arn": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-pulumi-import-option:*", "storedBytes": 0, "logGroupClass": "INFREQUENT_ACCESS", "logGroupArn": "arn:aws:logs:ap-northeast-1:000000000000:log-group:sandbox-pulumi-import-option" } ] }
import リソースオプションを使う場合は Pulumi コードを自分で実装する必要がある.さらに以下のように import リソースオプションに対象リソースの識別子を指定する.Amazon CloudWatch Logs ロググループの場合は name を指定する.
new aws.cloudwatch.LogGroup("sandbox-pulumi-import-option", { logGroupClass: "INFREQUENT_ACCESS", name: "sandbox-pulumi-import-option", region: "ap-northeast-1", retentionInDays: 90, }, { import: "sandbox-pulumi-import-option" });
ここで pulumi up コマンドを実行する.するとプレビュー時に 1 to import・デプロイ時に 1 imported と表示された❗️
$ pulumi up Previewing update (dev) Type Name Plan pulumi:pulumi:Stack sandbox-pulumi-aws-dev = └─ aws:cloudwatch:LogGroup sandbox-pulumi-import-option import Resources: = 1 to import 3 unchanged Do you want to perform this update? yes Updating (dev) Type Name Status pulumi:pulumi:Stack sandbox-pulumi-aws-dev = └─ aws:cloudwatch:LogGroup sandbox-pulumi-import-option imported (0.26s) Resources: = 1 imported 3 unchanged Duration: 3s
そして Pulumi 側にも登録されていた👌

最後にインポートした Amazon CloudWatch Logs ロググループ sandbox-pulumi-import-option の設定変更を試す.保持期間を 180日 に変更する.
new aws.cloudwatch.LogGroup("sandbox-pulumi-import-option", { logGroupClass: "INFREQUENT_ACCESS", name: "sandbox-pulumi-import-option", region: "ap-northeast-1", retentionInDays: 180, }, { import: "sandbox-pulumi-import-option" });
pulumi up コマンド実行して期待通りに変更できていた👌

関連記事
今回はドキュメントを参考に自分で考えながらインポートを試したけど,インポートを体験できるチュートリアル「Importing AWS Infrastructure」もあるので興味があったらこちらもぜひ❗️