Closed6

Pulumi でインポート作業メモ

Ryo YoshiiRyo Yoshii

Create a project

S3 Backend

$ pulumi login s3://bucket-name-here

Create a project that named import

$ pulumi new aws-typescript --force
This command will walk you through creating a new Pulumi project.

Enter a value or leave blank to accept the (default), and press <ENTER>.
Press ^C at any time to quit.

project name (import):  
project description (A minimal AWS TypeScript Pulumi program):  
Created project 'import'

stack name (dev):  
Created stack 'dev'
Enter your passphrase to protect config/secrets:  
Re-enter your passphrase to confirm:  

aws:region: The AWS region to deploy into (us-east-1): us-west-2 
Saved config
Ryo YoshiiRyo Yoshii

Import

pulumi import
Packages / AWS Classic

Importing resources

インポートの手段は2つ

  • pulumi import コマンド
    • 既存リソースを Pulumi stack に追加
    • コードを出力
    • CLI でインポートしたリソースはうっかり削除されないようにプロテクトされている
  • コードの中に import を書く
    • コードを先に書いて、インポートするリソースを指定する感じ
    • 即時に Pulumi stack へ追加されない、pulumi up で追加

インポートするために必要な情報は2つ

  • Type Token
    • API ドキュメントに書いてある
  • AWS リソースの ID と名前

Bulk Import

pulumi import コマンドで複数リソースをインポートする。

JSON を用意する。

my-resources.json
{
	"resources": [
        {
			"type": "aws:ec2/vpc:Vpc",
			"name": "application-vpc",
			"id": "vpc-0ad77710973388316"
		},
		{
			"type": "aws:ec2/subnet:Subnet",
			"name": "public-1",
			"id": "subnet-0fb5fdff92b9e5a3b"
		},
		{
			"type": "aws:ec2/subnet:Subnet",
			"name": "private-1",
			"id": "subnet-0a39d25dd9f7b7808"
		}
	]
}

-f オプションを付けてコマンドを実行する。

$ pulumi import --file ./my-resources.json
Ryo YoshiiRyo Yoshii

インポート失敗した

JSON にリソース記述して実行。記述ミスったらちゃんとコマンドも失敗した。
中途半端にインポートされることはなさそう。

$ pulumi import --file ./import_vpc.json
Enter your passphrase to unlock config/secrets
    (set PULUMI_CONFIG_PASSPHRASE or PULUMI_CONFIG_PASSPHRASE_FILE to remember):  
Enter your passphrase to unlock config/secrets
Previewing import (dev):
Downloading plugin: 250.91 MiB / 250.91 MiB [======================] 100.00% 25s

[resource plugin aws-6.36.0] installing
     Type                 Name                                Plan       Info
 +   pulumi:pulumi:Stack  import-dev                          create     1 error
 =   ├─ aws:ec2:Subnet    sandbox-subnet-public1-us-west-2a   import     5 warnings
 =   ├─ aws:ec2:Subnet    sandbox-subnet-public2-us-west-2b   import     5 warnings
 =   ├─ aws:ec2:Subnet    sandbox-subnet-private1-us-west-2a  import     1 error
 =   ├─ aws:ec2:Subnet    sandbox-subnet-public3-us-west-2c   import     5 warnings
 =   ├─ aws:ec2:Subnet    sandbox-subnet-private4-us-west-2d  import     5 warnings
 =   ├─ aws:ec2:Vpc       sandbox-vpc                         import     2 warnings
 =   ├─ aws:ec2:Subnet    sandbox-subnet-private2-us-west-2b  import     5 warnings
 =   ├─ aws:ec2:Subnet    sandbox-subnet-public4-us-west-2d   import     5 warnings
 =   └─ aws:ec2:Subnet    sandbox-subnet-private3-us-west-2c  import     5 warnings
Ryo YoshiiRyo Yoshii

完璧ではない

サブネットをインポートしようとすると Warning が出る。

  aws:ec2:Subnet (sandbox-subnet-public4-us-west-2d):
    warning: Type checking failed. If any of these are incorrect, please let us know by creating anissue at https://github.com/pului/pulumi-terraform-bridge/issues.
    warning: urn:pulumi:dev::import::aws:ec2/subnet:Subnet::sandbox-subnet-public4-us-west-2d verification warning: expected string type, got [] type: Examine values at tags.__defaults
    warning: One or more imported inputs failed to validate. This is almost certainly a bug in the `aws` provider. The import will still proceed, but you will need to edit the generated code after copying it into your program.
    warning: aws:ec2/subnet:Subnet resource 'sandbox-subnet-public4-us-west-2d' has a problem: Conflicting configuration arguments: "availability_zone": conflicts with availability_zone_id. Examine values at 'sandbox-subnet-public4-us-west-2d.availabilityZone'.
    warning: aws:ec2/subnet:Subnet resource 'sandbox-subnet-public4-us-west-2d' has a problem: Conflicting configuration arguments: "availability_zone_id": conflicts with availability_zone. Examine values at 'sandbox-subnet-public4-us-west-2d.availabilityZoneId'.

インポートした後、pulumi preview すると error になる。
availabilityZoneavailabilityZoneId の何れかを使えってことらしいけど、そうならインポート時にそうしてほしかった。

$ pulumi preview 
Enter your passphrase to unlock config/secrets
    (set PULUMI_CONFIG_PASSPHRASE or PULUMI_CONFIG_PASSPHRASE_FILE to remember):  
Enter your passphrase to unlock config/secrets
Previewing update (dev):
     Type                 Name                               Plan     Info
     pulumi:pulumi:Stack  import-dev                                  
     └─ aws:ec2:Subnet    sandbox-subnet-public2-us-west-2b           2 errors

Diagnostics:
  aws:ec2:Subnet (sandbox-subnet-public2-us-west-2b):
    error: aws:ec2/subnet:Subnet resource 'sandbox-subnet-public2-us-west-2b' has a problem: Conflicting configuration arguments: "availability_zone_id": conflicts with availability_zone. Examine values at 'sandbox-subnet-public2-us-west-2b.availabilityZoneId'.
    error: aws:ec2/subnet:Subnet resource 'sandbox-subnet-public2-us-west-2b' has a problem: Conflicting configuration arguments: "availability_zone": conflicts with availability_zone_id. Examine values at 'sandbox-subnet-public2-us-west-2b.availabilityZone'.
Ryo YoshiiRyo Yoshii

Output file を指定してインポート

pulumi import は標準出力にコードを出す。-o または --out でファイルに保存できるのでこっちが便利。

$ pulumi import --file ./import_vpc.json --out vpc.ts  

そのファイルを読み込むよう index.ts に1行追記してあげれば OK。

index.ts
import "./vpc";
このスクラップは2024/05/17にクローズされました