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

はじめに
前回は「Pulumi Kubernetes Operator」を利用したPulumi Programの継続デリバリーについて解説しました。今回は、Pulumiのリソース更新の流れをおさらいしつつ、既にクラウド環境にデプロイされているリソースについてPulumiで管理(import)する方法を紹介します。
おさらい:Pulumiの基本
既にクラウド環境などにデプロイされているリソースのPulumi管理化を実践するためには、Stack/Stateの概要やPulumiによるリソース更新の流れについて、ある程度理解しておく必要があります。Pulumiの基本的な内容となりますが、ここでPulumiのコンポーネントやリソース更新の流れについて、おさらいしておきます。
Pulumiの主要コンポーネントとState
Pulumiの主要コンポーネントの構成は下図に示すとおりです。Stackごとに現在のインフラストラクチャに関する情報がjsonで記録されていて、これを「State」と呼んでいます。
- Program → インフラストラクチャのあるべき姿を定義したもの
- Resource → インフラストラクチャを構成するオブジェクト(実際のインフラリソース)。オブジェクトのプロパティ(設定値)は他のオブジェクトに共有することが可能(図のInputs/Outputsの部分)
- Project → Programのソースコードとメタデータ(どのようにProgramを動かすかの情報)を格納するディレクトリ
- Stack → Projectディレクトリ内でProgramを「pulumi up」(Pulumi CLI)した後のインスタンス。同一のProgramから本番環境/ステージング環境など、用途に応じて複数の環境用にインスタンスを作成可能
Pulumiは、Stateからそのインフラストラクチャがいつどのように作成/削除/読み取り/更新されたかなどの情報を読み取り、「pulumi up」コマンド実行時のアクション(次はリソースを作成/更新または削除すべきかどうか)を決定します。
ちなみに、現在のStateは以下の手順で確認できます。
[前提]
- Pulumi v3.72.2
- あらかじめ「pulumi new」コマンドなどでStackが作成された状態
- 現在アクティブなStackを確認します。
1
$ pulumi stack ls
2
NAME LAST UPDATE RESOURCE COUNT URL
3
dev 1 hour ago 5 https://app.pulumi.com/****/quickstart2/dev
4
stg* n/a n/a https://app.pulumi.com/****/quickstart2/stg
- 今回は「dev」StackのStateを取得するので、「dev」Stackを選択します。選択後は再度stack lsで「dev」stackがアクティブであることを確認します。
1
$ pulumi stack select dev
2
3
$ pulumi stack ls
4
NAME LAST UPDATE RESOURCE COUNT URL
5
dev* 1 hour ago 5 https://app.pulumi.com/****/quickstart2/dev
6
stg n/a n/a https://app.pulumi.com/****/quickstart2/stg
- 「pulumi stack export」コマンドを実行して、現在のStackでStateを標準出力します。
01
$ pulumi stack export
02
{
03
"version": 3,
04
"deployment": {
05
"manifest": {
06
"time": "2023-09-26T17:36:36.814054+09:00",
07
"magic": "c57d2cc6e4ddc1ad908bcf42d81d39304d5e92a1de5a6e1d5a5c485a70ff807b",
08
"version": "v3.72.2"
09
},
10
"secrets_providers": {
11
"type": "service",
12
"state": {
13
"url": "https://api.pulumi.com",
14
"owner": "***",
15
"project": "quickstart2",
16
"stack": "dev"
17
}
18
},
19
"resources": [
20
{
21
"urn": "urn:pulumi:dev::quickstart2::pulumi:pulumi:Stack::quickstart2-dev",
22
"custom": false,
23
"type": "pulumi:pulumi:Stack",
24
"outputs": {
25
"bucketEndpoint": "http://storage.googleapis.com/my-bucket-b5f5f89/index.html-12e5385",
26
"bucketName": "gs://my-bucket-b5f5f89"
27
}
28
},
29
{
30
"urn": "urn:pulumi:dev::quickstart2::pulumi:providers:gcp::default",
31
"custom": true,
32
"id": "80738ccf-25df-4478-8b0a-f6c4c3a15dba",
33
"type": "pulumi:providers:gcp",
34
"inputs": {
35
"project": "pulumi-test",
36
"version": "6.29.0"
37
},
38
"outputs": {
39
"project": "pulumi-test",
40
"version": "6.29.0"
41
},
42
"parent": "urn:pulumi:dev::quickstart2::pulumi:pulumi:Stack::quickstart2-dev"
43
},
44
~~~~~~(略)~~~~~~
また、Stateの内容はPulumi service(GUI)でも「いつどのように作成/削除/読み取り/更新されたか」が視覚的に分かりやすい形で確認できます。
- 以下のコマンドを実行するとPulumi service画面が表示されます。実行前にログインが済んでいない場合は、ここで一度ログイン処理を実施します。
1
$ pulumi console
2
Manage your Pulumi stacks by logging in.
3
Run `pulumi login --help` for alternative login options.
4
Enter your access token from https://app.pulumi.com/account/tokens
5
or hit to log in using your browser
- pulumi service画面の「Stacks」タブに移動し、Stateを確認したい対象ProjectのStackをクリックします。
- リソース変更履歴欄右側の[Details]リンクをクリックします。 一番直近のpulumi実行履歴(activity)が表示されます。
Pulumiリソース更新の流れ
Pulumiによるリソース更新を簡単に図で表すと、下図のようになります。
Pulumiユーザーが「pulumi up」コマンドを実行すると、Programの更新をPulumi CLIで検知します。更新を検知したPulumi CLIは「Program(あるべき状態)」と「State(現在の状態)」を比較したのち、必要なアクション(リソースの作成/更新/削除)を決定します。実際のリソース作成/更新/削除はPulumi CLIからの情報を元に、AWSやGCPなどの各サービスに対応した「Provider」で行われます。
既存リソースのPulumi管理化(state import)
既に存在しているクラウド環境のインフラストラクチャ(リソース)をPulumiで管理したい場合は、2つの方法「Programにimport option(リソースID)を付与するimport」または「Pulumiコマンドによるimport」でimport処理を実施できます。
import処理を実施すると、PulumiのStateに対して「既に存在しているリソースの情報」を記録できます。Stateに「既に存在しているリソースの情報」が記録されていない状態、かつ「Programにはリソースの情報が記載されている状態」で「Pulumi up」を実施してしまうと、同じリソースが重複して作成されてしまいますので(詳細は後述)、必ず既存リソースのimport処理を実施しておく必要があります。
・import処理を実施せずにPulumi upを実行した場合【import option(リソースID)をProgramに付与してimportする流れ】
- Pulumiで管理したいリソースのリソースIDを調べる
- import option(リソースID)をProgramに記載する(管理したいリソースと同様の設定値もProgramに記載する)
- Pulumi upを実行して差分確認
【Pulumiコマンドによるimportの流れ】
- Pulumiで管理したいリソースのリソースIDを調べる
- リソースIDを引数に指定してPulumi importコマンドを実行する
- コマンド実行時に出力されたコードをProgramに記載する
- Pulumi upを実行して差分確認
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- PulumiでAWSリソースをデプロイしよう
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- TerraformからPulumiへの移行
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
- TFXを使った機械学習パイプラインの構築(実装編その1)
- TFXを使った機械学習パイプラインの構築(デプロイ編)