連載 [第3回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
2023年4月20日(木)
第3回となる今回は、Pulumi Stackの概要について解説し、複数Stackのデプロイについてハンズオンを実施していきます。
Pulumi Stackのデプロイ
デプロイ対象のStackに切り替えてから、Stackをデプロイします。
- 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
- 以下のコマンドで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
Stackデプロイ完了後にAWSマネジメントコンソールを確認すると、Stackの設定ファイルで設定したサブネット(IPアドレス)、availability zoneでEC2インスタンスが作成されていることが確認できます。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 - 次に、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
- 以下のコマンドで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
Stackデプロイ完了後に再度AWSマネジメントコンソールを確認すると、prod用Stackの設定ファイルで設定したサブネット(IPアドレス)、availability zoneでEC2インスタンスが作成されていることが確認できます。VPCはdev用Stackで作成したvpc-idと一致しています。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
以上のように、1つのProgramで複数のStackに対応したリソースの作成と、Stack設定ファイルを利用して容易にStack間で特定の値だけ差分を出すことができました。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- PulumiでAWSリソースをデプロイしよう
- 既に存在するリソースをPulumiで管理してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- TerraformからPulumiへの移行
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- 「Terraform」のコードを自分で書けるようになろう
- kustomizeで復数環境のマニフェストファイルを簡単整理
- マシン・イメージを自動構築し、作業効率を高めるPacker入門