既に存在するリソースをPulumiで管理してみよう

2023年10月19日(木)
大関 研丞 (Kenneth Ozeki)
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Programにimport option(リソースID)を
付与した場合のPulumi up

次に、import option(リソースID)を付与した場合のPulumi upの挙動を確認していきます。

  1. APIリファレンスによると、S3 Bucketの場合「bucket-name」がリソースIDとなるため、以下のように「s3.Bucket functionの引数」に「opts=ResourceOptions(import_='my-bucket-pulumi')」を追記します。「import_」に続く値がS3 BucketのリソースID(bucket-name)になります。既存リソースのimportに利用するpythonモジュール「ResourceOptions」のimportも忘れずに記載します。
    import pulumi
    from pulumi_aws import s3
    from pulumi import ResourceOptions
    
    bucket = s3.Bucket('my-bucket-pulumi',
      opts=ResourceOptions(import_='my-bucket-pulumi'))
    
    pulumi.export('bucket_name', bucket.id)
    【Pulumi Program (__main__.py)】
  2. この状態で一度pulumi upを実行すると、先ほどのケースとは異なりbucketのplan内容が「create」ではなく「import」になっていることが分かります。これはS3 Bucketについて実際にリソースを作成(create)せずに、指定したIDのリソース情報をstateに追加するplan内容となります。
    $ pulumi up                          
    Previewing update (***/dev)
    
    View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/previews/***
    
         Type                 Name               Plan       
     +   pulumi:pulumi:Stack  pulumi-import-dev  create     
     =   └─ aws:s3:Bucket     my-bucket-pulumi   import     
    
    
    Outputs:
        bucket_name: "my-bucket-pulumi"
    
    Resources:
        + 1 to create
        = 1 to import
        2 changes
    
    Do you want to perform this update? yes
    Updating (***/dev)
    
    View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/updates/4
    
         Type                 Name               Status               
     +   pulumi:pulumi:Stack  pulumi-import-dev  created (2s)         
     =   └─ aws:s3:Bucket     my-bucket-pulumi   imported (0.72s)     
    
    
    Outputs:
        bucket_name: "my-bucket-pulumi"
    
    Resources:
        + 1 created
        = 1 imported
        2 changes
    
    Duration: 6s
  3. importが無事完了すると、AWSマネジメントコンソールでは、先ほどの「リソースIDを付与しない場合のPulumi up」のケースのように新たにリソースが作成されず、かつ以下のようにstateにリソースの情報が追加されていることが確認できます。
    $ pulumi stack export
                             
    {
        "version": 3,
        "deployment": {
            "manifest": {
                "time": "2023-09-28T17:14:41.428624+09:00",
                "magic": "1fce246d436c6e46d168db13ed1014131c96be0ccf8401639052718fba57ac37",
                "version": "v3.72.2"
            },
            "secrets_providers": {
                "type": "service",
                "state": {
                    "url": "https://api.pulumi.com",
                    "owner": "***",
                    "project": "pulumi-import",
                    "stack": "dev"
                }
            },
            "resources": [
                {
                    "urn": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
                    "custom": false,
                    "type": "pulumi:pulumi:Stack",
                    "outputs": {
                        "bucket_name": "my-bucket-pulumi"
                    },
                    "created": "2023-09-28T08:14:39.351901Z",
                    "modified": "2023-09-28T08:14:39.351901Z"
                },
                {
                    "urn": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1",
                    "custom": true,
                    "id": "b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
                    "type": "pulumi:providers:aws",
                    "inputs": {
                        "region": "ap-northeast-1",
                        "skipCredentialsValidation": "false",
                        "skipMetadataApiCheck": "true",
                        "skipRegionValidation": "true",
                        "version": "6.2.1"
                    },
                    "outputs": {
                        "region": "ap-northeast-1",
                        "skipCredentialsValidation": "false",
                        "skipMetadataApiCheck": "true",
                        "skipRegionValidation": "true",
                        "version": "6.2.1"
                    },
                    "created": "2023-09-28T08:14:40.485069Z",
                    "modified": "2023-09-28T08:14:40.485069Z"
                },
                {
                    "urn": "urn:pulumi:dev::pulumi-import::aws:s3/bucket:Bucket::my-bucket-pulumi",
                    "custom": true,
                    "id": "my-bucket-pulumi",
                    "type": "aws:s3/bucket:Bucket",
                    "inputs": {
                        "__defaults": [
                            "acl",
                            "bucket",
                            "forceDestroy"
                        ],
                        "acl": "private",
                        "bucket": "my-bucket-pulumi",
                        "forceDestroy": false
                    },
                    "outputs": {
                        "accelerationStatus": "",
                        "arn": "arn:aws:s3:::my-bucket-pulumi",
                        "bucket": "my-bucket-pulumi",
                        "bucketDomainName": "my-bucket-pulumi.s3.amazonaws.com",
                        "bucketRegionalDomainName": "my-bucket-pulumi.s3.ap-northeast-1.amazonaws.com",
                        "corsRules": [],
                        "grants": [],
                        "hostedZoneId": "Z2M4EHUR26P7ZW",
                        "id": "my-bucket-pulumi",
                        "lifecycleRules": [],
                        "loggings": [],
                        "objectLockConfiguration": null,
                        "region": "ap-northeast-1",
                        "replicationConfiguration": null,
                        "requestPayer": "BucketOwner",
                        "serverSideEncryptionConfiguration": {
                            "rule": {
                                "applyServerSideEncryptionByDefault": {
                                    "kmsMasterKeyId": "",
                                    "sseAlgorithm": "AES256"
                                },
                                "bucketKeyEnabled": true
                            }
                        },
                        "versioning": {
                            "enabled": false,
                            "mfaDelete": false
                        },
                        "website": null
                    },
                    "parent": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
                    "provider": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1::b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
                    "additionalSecretOutputs": [
                        "tagsAll"
                    ],
                    "importID": "my-bucket-pulumi",
                    "created": "2023-09-28T08:14:41.418829Z",
                    "modified": "2023-09-28T08:14:41.418829Z"
                }
            ]
        }
    }
著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

既に存在するリソースをPulumiで管理してみよう

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています