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

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

Pulumi Stackのデプロイ

デプロイ対象のStackに切り替えてから、Stackをデプロイします。

  1. dev用のStackに切り替えます。
    $ pulumi stack select dev
    
    $ pulumi stack ls        
    NAME  LAST UPDATE  RESOURCE COUNT  URL
    dev*  n/a          n/a             https://app.pulumi.com/***/pulumi-stack/dev
    prod  n/a          n/a             https://app.pulumi.com/***/pulumi-stack/prod
  2. 以下のコマンドでdev用のStackをデプロイします。コマンド実行後のプロンプトで「details」を選択すると、これから作成するリソースの詳細を確認できます。コマンド実行後のプロンプトで「yes」を選択することで、実際にリソースが作成されます。
    $ pulumi up
    Previewing update (dev)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/dev/previews/34b3bd06-38d0-4601-a5c3-***
    
         Type                 Name              Plan       
     +   pulumi:pulumi:Stack  pulumi-stack-dev  create     
     +   ├─ aws:ec2:Vpc       my-vpc            create     
     +   ├─ aws:ec2:Subnet    dev-my-subnet     create     
     +   └─ aws:ec2:Instance  dev-my-instance   create     
    
    
    Outputs:
        vpc_id: output<string>
    
    Resources:
        + 4 to create
    
    Do you want to perform this update? details
    + pulumi:pulumi:Stack: (create)
        [urn=urn:pulumi:dev::pulumi-stack::pulumi:pulumi:Stack::pulumi-stack-dev]
        + aws:ec2/vpc:Vpc: (create)
            [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::04da6b54-80e4-46f7-96ec-***]
            cidrBlock       : "10.0.0.0/16"
            enableDnsSupport: true
            instanceTenancy : "default"
            tags            : {
                Name      : "my-vpc"
            }
        + aws:ec2/subnet:Subnet: (create)
            [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::04da6b54-80e4-46f7-96ec-***]
            assignIpv6AddressOnCreation            : false
            availabilityZone                       : "ap-northeast-1a"
            cidrBlock                              : "10.0.1.0/24"
            enableDns64                            : false
            enableResourceNameDnsARecordOnLaunch   : false
            enableResourceNameDnsAaaaRecordOnLaunch: false
            ipv6Native                             : false
            mapPublicIpOnLaunch                    : false
            tags                                   : {
                Name      : "dev-my-subnet"
            }
            vpcId                                  : output<string>
        + aws:ec2/instance:Instance: (create)
            [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::04da6b54-80e4-46f7-96ec-***]
            ami                    : "ami-0ec1b47781bc9d6d1"
            getPasswordData        : false
            instanceType           : "t2.micro"
            sourceDestCheck        : true
            subnetId               : output
            tags                   : {
                Name      : "dev-my-instance"
            }
            userDataReplaceOnChange: false
        --outputs:--
        vpc_id: output<string>
    
    Do you want to perform this update? yes
    Updating (dev)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/dev/updates/10
    
         Type                 Name              Status              
     +   pulumi:pulumi:Stack  pulumi-stack-dev  created (3s)        
     +   ├─ aws:ec2:Vpc       my-vpc            created (1s)        
     +   ├─ aws:ec2:Subnet    dev-my-subnet     created (0.88s)     
     +   └─ aws:ec2:Instance  dev-my-instance   created (42s)       
    
    
    Outputs:
        vpc_id: "vpc-000f8f3d29d5dc0db"
    
    Resources:
        + 4 created
    
    Duration: 48s
    Stackデプロイ完了後にAWSマネジメントコンソールを確認すると、Stackの設定ファイルで設定したサブネット(IPアドレス)、availability zoneでEC2インスタンスが作成されていることが確認できます。

    dev用のEC2インスタンス

  3. 次に、prod用のStackをデプロイします。prod用Stackに切り替えます。
    $ pulumi stack select prod
    
    $ pulumi stack ls
    NAME   LAST UPDATE     RESOURCE COUNT  URL
    dev    21 minutes ago  6               https://app.pulumi.com/***/pulumi-stack/dev
    prod*  n/a             n/a             https://app.pulumi.com/***/pulumi-stack/prod
  4. 以下のコマンドでprod用Stackをデプロイします。dev用Stackデプロイ時とは異なり、VPCは新規作成されずに既存VPCが利用されるため、作成されるリソース数は「3」になります。
    $ pulumi up
    Previewing update (prod)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/prod/previews/81b65057-14b5-4727-94ee-***
    
         Type                 Name               Plan       
     +   pulumi:pulumi:Stack  pulumi-stack-prod  create     
     +   ├─ aws:ec2:Subnet    prod-my-subnet     create     
     +   └─ aws:ec2:Instance  prod-my-instance   create     
    
    
    Resources:
        + 3 to create
    
    Do you want to perform this update? details
    + pulumi:pulumi:Stack: (create)
        [urn=urn:pulumi:prod::pulumi-stack::pulumi:pulumi:Stack::pulumi-stack-prod]
        > pulumi:pulumi:StackReference: (read)
            [urn=urn:pulumi:prod::pulumi-stack::pulumi:pulumi:StackReference::***/pulumi-stack/dev]
            name: "***/pulumi-stack/dev"
        > aws:ec2/vpc:Vpc: (read)
            [urn=urn:pulumi:prod::pulumi-stack::aws:ec2/vpc:Vpc::my-vpc]
            [provider=urn:pulumi:prod::pulumi-stack::pulumi:providers:aws::default_5_32_0::04da6b54-80e4-46f7-96ec-***]
        + aws:ec2/subnet:Subnet: (create)
            [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::04da6b54-80e4-46f7-96ec-***]
            assignIpv6AddressOnCreation            : false
            availabilityZone                       : "ap-northeast-1c"
            cidrBlock                              : "10.0.2.0/24"
            enableDns64                            : false
            enableResourceNameDnsARecordOnLaunch   : false
            enableResourceNameDnsAaaaRecordOnLaunch: false
            ipv6Native                             : false
            mapPublicIpOnLaunch                    : false
            tags                                   : {
                Name      : "prod-my-subnet"
            }
            vpcId                                  : "vpc-000f8f3d29d5dc0db"
        + aws:ec2/instance:Instance: (create)
            [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::04da6b54-80e4-46f7-96ec-***]
            ami                    : "ami-0ec1b47781bc9d6d1"
            getPasswordData        : false
            instanceType           : "t2.micro"
            sourceDestCheck        : true
            subnetId               : output
            tags                   : {
                Name      : "prod-my-instance"
            }
            userDataReplaceOnChange: false
            --outputs:--
            outputs          : {
                vpc_id: "vpc-000f8f3d29d5dc0db"
            }
            --outputs:--
            arn                             : "arn:aws:ec2:ap-northeast-1:926403295735:vpc/vpc-000f8f3d29d5dc0db"
            assignGeneratedIpv6CidrBlock    : false
            cidrBlock                       : "10.0.0.0/16"
            defaultNetworkAclId             : "acl-0facbbc0866561ec0"
            defaultRouteTableId             : "rtb-0140076c77222bf7e"
            defaultSecurityGroupId          : "sg-03f7806283c495de6"
            dhcpOptionsId                   : "dopt-0473b1074a6fa03c1"
            enableClassiclink               : false
            enableClassiclinkDnsSupport     : false
            enableDnsHostnames              : false
            enableDnsSupport                : true
            enableNetworkAddressUsageMetrics: false
            id                              : "vpc-000f8f3d29d5dc0db"
            instanceTenancy                 : "default"
            ipv6NetmaskLength               : 0
            mainRouteTableId                : "rtb-0140076c77222bf7e"
            ownerId                         : "926403295735"
            tags                            : {
                Name: "my-vpc"
            }
            tagsAll                         : {
                Name: "my-vpc"
            }
    
    Do you want to perform this update? yes
    Updating (prod)
    
    View Live: https://app.pulumi.com/***/pulumi-stack/prod/updates/9
    
         Type                 Name               Status              
     +   pulumi:pulumi:Stack  pulumi-stack-prod  created (1s)        
     +   ├─ aws:ec2:Subnet    prod-my-subnet     created (0.95s)     
     +   └─ aws:ec2:Instance  prod-my-instance   created (62s)       
    
    
    Resources:
        + 3 created
    
    Duration: 1m9s
    Stackデプロイ完了後に再度AWSマネジメントコンソールを確認すると、prod用Stackの設定ファイルで設定したサブネット(IPアドレス)、availability zoneでEC2インスタンスが作成されていることが確認できます。VPCはdev用Stackで作成したvpc-idと一致しています。

以上のように、1つのProgramで複数のStackに対応したリソースの作成と、Stack設定ファイルを利用して容易にStack間で特定の値だけ差分を出すことができました。

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

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