「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法

2023年4月20日(木)
大関 研丞 (Kenneth Ozeki)
第3回となる今回は、Pulumi Stackの概要について解説し、複数Stackのデプロイについてハンズオンを実施していきます。

クリーンアップ作業

今回のハンズオンで構築した環境のクリーンアップ手順となります。複数のStackをデプロイしているため、リソースの削除もStackを切り替えて行います。

  1. dev用StackでVPCを作成しているため、VPCを利用しているprod用StackのリソースからでないとVPCを削除できないため、先にprod用Stackのリソースから削除します。prod用Stackに切り替えます。
    $ pulumi stack select prod
    
    $ pulumi stack ls        
    NAME  LAST UPDATE    RESOURCE COUNT  URL
    dev  6 minutes ago  6               https://app.pulumi.com/***/pulumi-stack/dev
    prod*  4 minutes ago  8               https://app.pulumi.com/***/pulumi-stack/prod
  2. Pulumiで作成したリソースを削除する際は「pulumi destroy」コマンドを実行します。「pulumi up」と同じく「details」の選択で削除するリソースの詳細が確認できます。問題がなければ「yes」を選択します。
    $ pulumi destroy
    Previewing destroy (prod)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/prod/previews/6cde348b-595c-4756-9de6-***
    
         Type                 Name               Plan       
     -   pulumi:pulumi:Stack  pulumi-stack-prod  delete     
     -   ├─ aws:ec2:Instance  prod-my-instance   delete     
     -   └─ aws:ec2:Subnet    prod-my-subnet     delete     
    
    
    Resources:
        - 3 to delete
    
    Do you want to perform this destroy? details
    - aws:ec2/instance:Instance: (delete)
        [id=i-0b700d8c150e5e938]
        [urn=urn:pulumi:prod::pulumi-stack::aws:ec2/instance:Instance::prod-my-instance]
        [provider=urn:pulumi:prod::pulumi-stack::pulumi:providers:aws::default_5_32_0::05b1fe6f-4ea7-4af8-b47d-***]
    - aws:ec2/subnet:Subnet: (delete)
        [id=subnet-0cf5b7c6fd6cdfc9f]
        [urn=urn:pulumi:prod::pulumi-stack::aws:ec2/subnet:Subnet::prod-my-subnet]
        [provider=urn:pulumi:prod::pulumi-stack::pulumi:providers:aws::default_5_32_0::05b1fe6f-4ea7-4af8-b47d-***]
    
  3. 次に、dev用Stackのリソースも削除します。dev用Stackに切り替えます。
    $ pulumi stack select dev
    
    $ pulumi stack ls        
    NAME  LAST UPDATE    RESOURCE COUNT  URL
    dev*  6 minutes ago  6               https://app.pulumi.com/***/pulumi-stack/dev
    prod  3 minutes ago  0               https://app.pulumi.com/***/pulumi-stack/prod
  4. 同様に「pulumi destroy」コマンドを実行します。
    $ pulumi destroy         
    Previewing destroy (dev)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/dev/previews/b9a22195-cc68-4639-a4ac-***
    
         Type                 Name              Plan       
     -   pulumi:pulumi:Stack  pulumi-stack-dev  delete     
     -   ├─ aws:ec2:Instance  dev-my-instance   delete     
     -   ├─ aws:ec2:Subnet    dev-my-subnet     delete     
     -   └─ aws:ec2:Vpc       my-vpc            delete     
    
    
    Outputs:
      - vpc_id: "vpc-000f8f3d29d5dc0db"
    
    Resources:
        - 4 to delete
    
    Do you want to perform this destroy? details
    - aws:ec2/instance:Instance: (delete)
        [id=i-038301e0f4d846fc0]
        [urn=urn:pulumi:dev::pulumi-stack::aws:ec2/instance:Instance::dev-my-instance]
        [provider=urn:pulumi:dev::pulumi-stack::pulumi:providers:aws::default_5_32_0::3ff48aaf-c093-4fec-b80a-***]
    - aws:ec2/subnet:Subnet: (delete)
        [id=subnet-0aaf0264734052dd9]
        [urn=urn:pulumi:dev::pulumi-stack::aws:ec2/subnet:Subnet::dev-my-subnet]
        [provider=urn:pulumi:dev::pulumi-stack::pulumi:providers:aws::default_5_32_0::3ff48aaf-c093-4fec-b80a-***]
    - aws:ec2/vpc:Vpc: (delete)
        [id=vpc-000f8f3d29d5dc0db]
        [urn=urn:pulumi:dev::pulumi-stack::aws:ec2/vpc:Vpc::my-vpc]
        [provider=urn:pulumi:dev::pulumi-stack::pulumi:providers:aws::default_5_32_0::3ff48aaf-c093-4fec-b80a-***]
    - pulumi:pulumi:Stack: (delete)
        [urn=urn:pulumi:dev::pulumi-stack::pulumi:pulumi:Stack::pulumi-stack-dev]
        --outputs:--
      - vpc_id: "vpc-000f8f3d29d5dc0db"
    
    Do you want to perform this destroy? yes
    Destroying (dev)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/dev/updates/13
    
         Type                 Name              Status              
     -   pulumi:pulumi:Stack  pulumi-stack-dev  deleted             
     -   ├─ aws:ec2:Instance  dev-my-instance   deleted (30s)       
     -   ├─ aws:ec2:Subnet    dev-my-subnet     deleted (0.76s)     
     -   └─ aws:ec2:Vpc       my-vpc            deleted (1s)        
    
    
    Outputs:
      - vpc_id: "vpc-000f8f3d29d5dc0db"
    
    Resources:
        - 4 deleted
    
    Duration: 36s
    devおよびprodのStackリソース削除完了後、AWSマネジメントコンソールでも両Stackのリソースが削除されていることが確認できます。
  5. Stackリソースの削除が完了したことで、AWSに作成した全てのリソースも削除されましたが、Pulumiのリソースとしてまだ残っているStack自体も削除できます。Stack自体を削除すると「pulumi config」などで設定したStack自体の設定やStackのリソース変更履歴、Stackの設定ファイル「Pulumi.<stack名>.yaml」なども削除されるため注意してください。Stack削除コマンド「pulumi stack rm」実行後は、確認としてStack名の入力が求められるので、削除対象のStack名を入力します。
    $ pulumi stack select dev
    
    $ pulumi stack ls
    NAME  LAST UPDATE     RESOURCE COUNT  URL
    dev*  11 minutes ago  0               https://app.pulumi.com/***/pulumi-stack/dev
    prod  6 minutes ago   0               https://app.pulumi.com/***/pulumi-stack/prod
    
    $ pulumi stack rm
    This will permanently remove the 'dev' stack!
    Please confirm that this is what you'd like to do by typing `dev`: dev
    Stack 'dev' has been removed!
    
    $ pulumi stack select prod
    
    $ pulumi stack ls         
    NAME   LAST UPDATE    RESOURCE COUNT  URL
    prod*  6 minutes ago  0               https://app.pulumi.com/***/pulumi-stack/prod
    
    $ pulumi stack rm         
    This will permanently remove the 'prod' stack!
    Please confirm that this is what you'd like to do by typing `prod`: prod
    Stack 'prod' has been removed!
    
    $ pulumi stack ls
    NAME  LAST UPDATE  RESOURCE COUNT  URL

おわりに

今回は、Pulumi Stackの概要について解説し、複数Stackのデプロイについてハンズオンを実施しました。簡単なハンズオンではありますが、1つのProgramで複数のStackに対応したリソースを作成でき、また、Stack間で特定の値だけ差分を出す方法について、少しイメージできたのではないでしょうか。

Stackをうまく使いこなすことでインフラ環境の再現が容易になり、また、環境(dev/prodなど)の分離やアプリケーションの分離も明確になり、オペレーションミスなどの事故も未然に防げるようになります。ぜひ、この機会にPulumi Stackについて理解を深めていただければと思います。

次回以降も、引き続きPulumiの便利な機能について紹介していきますので、お楽しみに!

【参考】Pulumi公式ホームページ(英語)

著者
大関 研丞 (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メルマガ会員のサービス内容を見る

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