連載 [第9回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理TerraformからPulumiへの移行
2023年11月28日(火)

第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
【Coexistence】Terraform state fileの読み取り
TerraformからPulumiへ完全移行する前に、Coexistenceのケースを想定したハンズオンを実施してみます。簡単な手順ですが、具体的にはTerraformとPulumiを共存させるケースで、PulumiからTerraform stateファイルにアクセスしてTerraformで作成したS3 Bucketの情報を取得し、Pulumiで該当BucketにObjectを新規作成/格納する方法を検証します。
- 先ほどTerraformを実行したディレクトリから1つ上の階層に移動し、新たにPulumiを実行するためのディレクトリを作成/移動します。
1
$ pwd
2
/***/terraform-aws-s3
3
4
$ cd ..
5
6
$ mkdir pulumi-migrate && cd pulumi-migrate
7
8
$ pwd
9
/***/pulumi-migrate
- PulumiからTerraform stateファイルの参照に必要なpython packageをインストールします。
1
$ pip3 install pulumi_terraform
- 「pulumi new」コマンドを実行してProgram(Project)の雛形を作成します。「project name」「project description」「stack name」はデフォルト値で設定し、「aws:region:」については「ap-northeast-1」を設定しました。
01
$ pulumi new aws-python
02
This command will walk you through creating a new Pulumi project.
03
04
Enter a value or leave blank to accept the (default), and press <ENTER>.
05
Press ^C at any time to quit.
06
07
project name: (pulumi-migrate)
08
project description: (A minimal AWS Python Pulumi program)
09
Created project 'pulumi-migrate'
10
11
Please enter your desired stack name.
12
To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
13
stack name: (dev)
14
Created stack 'dev'
15
16
aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1
17
Saved config
18
19
Installing dependencies...
20
~~(中略)~~
21
Your new project is ready to go! ✨
22
23
To perform an initial deployment, run `pulumi up`
- Program(__main__.py)を編集します。
以下コードに書き換えます。pythonの実行環境によって異なるとは思いますが、念のため先ほどインストールした「pulumi_terraform」モジュールのpathを明示的に指定しています。terraform stateファイルの読み込みは「terraform.state.LocalBackendArgs」で行ない、terraform stateファイルでoutput出力した「bucket_id」を変数「bucket_name」に格納し、bucket objectの格納先として「aws.s3.BucketObject」のpropertyで指定しています。
1
$ vi __main__.py
【Pulumi Program(__main__.py)】01
import pulumi
02
import pulumi_aws as aws
03
04
#「pulumi_terraform」モジュールのpathを明示的に指定 (必要な場合のみ)
05
import sys
06
sys.path.append('<path to pulumi_terraform module>')
07
08
import pulumi_terraform as terraform
09
10
bucket_state = terraform.state.RemoteStateReference(
11
'myBucket',
12
backend_type='local',
13
args=terraform.state.LocalBackendArgs(path='../terraform-aws-s3/terraform.tfstate'))
14
15
bucket_name = bucket_state.get_output('bucket_id')
16
17
bucket_object = aws.s3.BucketObject(
18
'myBucketObject',
19
bucket=bucket_name,
20
source=pulumi.FileAsset("sample.txt"))
21
22
pulumi.export("bucketName", bucket_name)
- Objectとして作成するファイルをローカルに用意します。
1
$ echo "test" > sample.txt
- pulumi upを実行して、リソースをデプロイします。
実行結果からも分かる通り、outputとしてterraform stateファイルから取得したbucket_idが設定されていることが確認できます。
01
$ pulumi up
02
Previewing update (dev)
03
04
View in Browser (Ctrl+O): https://app.pulumi.com/CL_Kenneth/pulumi-migrate/dev/previews/***
05
06
Downloading plugin: 181.40 MiB / 181.40 MiB [======================] 100.00% 18s
07
[resource plugin aws-6.9.0] installing
08
Type Name Plan
09
+ pulumi:pulumi:Stack pulumi-migrate-dev create
10
+ └─ aws:s3:BucketObject myBucketObject create
11
12
13
Outputs:
14
bucketName: "tf-bucket-8o8ezl7s"
15
16
Resources:
17
+ 2 to create
18
19
Do you want to perform this update? yes
20
Updating (dev)
21
22
View in Browser (Ctrl+O): https://app.pulumi.com/CL_Kenneth/pulumi-migrate/dev/updates/1
23
24
Type Name Status
25
+ pulumi:pulumi:Stack pulumi-migrate-dev created (1s)
26
+ └─ aws:s3:BucketObject myBucketObject created (0.41s)
27
28
29
Outputs:
30
bucketName: "tf-bucket-8o8ezl7s"
31
32
Resources:
33
+ 2 created
34
35
Duration: 6s
また、該当BucketにObjectが無事作成されていることが確認できます。1
Outputs:
2
bucketName: "tf-bucket-8o8ezl7s"
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
- Iacツール「Terraform」の基本的な使い方
- 既に存在するリソースをPulumiで管理してみよう
- PulumiでAWSリソースをデプロイしよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- Infrastructure-as-Codeアプローチと「Pulumi」の概要
- インフラの構成管理を自動化するTerraform入門