既に存在するリソースを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も忘れずに記載します。
    1import pulumi
    2from pulumi_aws import s3
    3from pulumi import ResourceOptions
    4 
    5bucket = s3.Bucket('my-bucket-pulumi',
    6  opts=ResourceOptions(import_='my-bucket-pulumi'))
    7 
    8pulumi.export('bucket_name', bucket.id)
    【Pulumi Program (__main__.py)】
  2. この状態で一度pulumi upを実行すると、先ほどのケースとは異なりbucketのplan内容が「create」ではなく「import」になっていることが分かります。これはS3 Bucketについて実際にリソースを作成(create)せずに、指定したIDのリソース情報をstateに追加するplan内容となります。
    01$ pulumi up                         
    02Previewing update (***/dev)
    03 
    04View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/previews/***
    05 
    06     Type                 Name               Plan      
    07 +   pulumi:pulumi:Stack  pulumi-import-dev  create    
    08 =   └─ aws:s3:Bucket     my-bucket-pulumi   import    
    09 
    10 
    11Outputs:
    12    bucket_name: "my-bucket-pulumi"
    13 
    14Resources:
    15    + 1 to create
    16    = 1 to import
    17    2 changes
    18 
    19Do you want to perform this update? yes
    20Updating (***/dev)
    21 
    22View in Browser (Ctrl+O): https://app.pulumi.com/***/pulumi-import/dev/updates/4
    23 
    24     Type                 Name               Status              
    25 +   pulumi:pulumi:Stack  pulumi-import-dev  created (2s)        
    26 =   └─ aws:s3:Bucket     my-bucket-pulumi   imported (0.72s)    
    27 
    28 
    29Outputs:
    30    bucket_name: "my-bucket-pulumi"
    31 
    32Resources:
    33    + 1 created
    34    = 1 imported
    35    2 changes
    36 
    37Duration: 6s
  3. importが無事完了すると、AWSマネジメントコンソールでは、先ほどの「リソースIDを付与しない場合のPulumi up」のケースのように新たにリソースが作成されず、かつ以下のようにstateにリソースの情報が追加されていることが確認できます。
    001$ pulumi stack export
    002                          
    003{
    004    "version": 3,
    005    "deployment": {
    006        "manifest": {
    007            "time": "2023-09-28T17:14:41.428624+09:00",
    008            "magic": "1fce246d436c6e46d168db13ed1014131c96be0ccf8401639052718fba57ac37",
    009            "version": "v3.72.2"
    010        },
    011        "secrets_providers": {
    012            "type": "service",
    013            "state": {
    014                "url": "https://api.pulumi.com",
    015                "owner": "***",
    016                "project": "pulumi-import",
    017                "stack": "dev"
    018            }
    019        },
    020        "resources": [
    021            {
    022                "urn": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
    023                "custom": false,
    024                "type": "pulumi:pulumi:Stack",
    025                "outputs": {
    026                    "bucket_name": "my-bucket-pulumi"
    027                },
    028                "created": "2023-09-28T08:14:39.351901Z",
    029                "modified": "2023-09-28T08:14:39.351901Z"
    030            },
    031            {
    032                "urn": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1",
    033                "custom": true,
    034                "id": "b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
    035                "type": "pulumi:providers:aws",
    036                "inputs": {
    037                    "region": "ap-northeast-1",
    038                    "skipCredentialsValidation": "false",
    039                    "skipMetadataApiCheck": "true",
    040                    "skipRegionValidation": "true",
    041                    "version": "6.2.1"
    042                },
    043                "outputs": {
    044                    "region": "ap-northeast-1",
    045                    "skipCredentialsValidation": "false",
    046                    "skipMetadataApiCheck": "true",
    047                    "skipRegionValidation": "true",
    048                    "version": "6.2.1"
    049                },
    050                "created": "2023-09-28T08:14:40.485069Z",
    051                "modified": "2023-09-28T08:14:40.485069Z"
    052            },
    053            {
    054                "urn": "urn:pulumi:dev::pulumi-import::aws:s3/bucket:Bucket::my-bucket-pulumi",
    055                "custom": true,
    056                "id": "my-bucket-pulumi",
    057                "type": "aws:s3/bucket:Bucket",
    058                "inputs": {
    059                    "__defaults": [
    060                        "acl",
    061                        "bucket",
    062                        "forceDestroy"
    063                    ],
    064                    "acl": "private",
    065                    "bucket": "my-bucket-pulumi",
    066                    "forceDestroy": false
    067                },
    068                "outputs": {
    069                    "accelerationStatus": "",
    070                    "arn": "arn:aws:s3:::my-bucket-pulumi",
    071                    "bucket": "my-bucket-pulumi",
    072                    "bucketDomainName": "my-bucket-pulumi.s3.amazonaws.com",
    073                    "bucketRegionalDomainName": "my-bucket-pulumi.s3.ap-northeast-1.amazonaws.com",
    074                    "corsRules": [],
    075                    "grants": [],
    076                    "hostedZoneId": "Z2M4EHUR26P7ZW",
    077                    "id": "my-bucket-pulumi",
    078                    "lifecycleRules": [],
    079                    "loggings": [],
    080                    "objectLockConfiguration": null,
    081                    "region": "ap-northeast-1",
    082                    "replicationConfiguration": null,
    083                    "requestPayer": "BucketOwner",
    084                    "serverSideEncryptionConfiguration": {
    085                        "rule": {
    086                            "applyServerSideEncryptionByDefault": {
    087                                "kmsMasterKeyId": "",
    088                                "sseAlgorithm": "AES256"
    089                            },
    090                            "bucketKeyEnabled": true
    091                        }
    092                    },
    093                    "versioning": {
    094                        "enabled": false,
    095                        "mfaDelete": false
    096                    },
    097                    "website": null
    098                },
    099                "parent": "urn:pulumi:dev::pulumi-import::pulumi:pulumi:Stack::pulumi-import-dev",
    100                "provider": "urn:pulumi:dev::pulumi-import::pulumi:providers:aws::default_6_2_1::b4c8a4e5-e5ce-4b35-88ae-fb4a3ae43b83",
    101                "additionalSecretOutputs": [
    102                    "tagsAll"
    103                ],
    104                "importID": "my-bucket-pulumi",
    105                "created": "2023-09-28T08:14:41.418829Z",
    106                "modified": "2023-09-28T08:14:41.418829Z"
    107            }
    108        ]
    109    }
    110}
著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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