連載 [第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を実行するためのディレクトリを作成/移動します。
$ pwd /***/terraform-aws-s3 $ cd .. $ mkdir pulumi-migrate && cd pulumi-migrate $ pwd /***/pulumi-migrate
- PulumiからTerraform stateファイルの参照に必要なpython packageをインストールします。
$ pip3 install pulumi_terraform
- 「pulumi new」コマンドを実行してProgram(Project)の雛形を作成します。「project name」「project description」「stack name」はデフォルト値で設定し、「aws:region:」については「ap-northeast-1」を設定しました。
$ pulumi new aws-python This command will walk you through creating a new Pulumi project. Enter a value or leave blank to accept the (default), and press <ENTER>. Press ^C at any time to quit. project name: (pulumi-migrate) project description: (A minimal AWS Python Pulumi program) Created project 'pulumi-migrate' Please enter your desired stack name. To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`). stack name: (dev) Created stack 'dev' aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1 Saved config Installing dependencies... ~~(中略)~~ Your new project is ready to go! ✨ To perform an initial deployment, run `pulumi up`
- Program(__main__.py)を編集します。
$ vi __main__.py
以下コードに書き換えます。pythonの実行環境によって異なるとは思いますが、念のため先ほどインストールした「pulumi_terraform」モジュールのpathを明示的に指定しています。terraform stateファイルの読み込みは「terraform.state.LocalBackendArgs」で行ない、terraform stateファイルでoutput出力した「bucket_id」を変数「bucket_name」に格納し、bucket objectの格納先として「aws.s3.BucketObject」のpropertyで指定しています。import pulumi import pulumi_aws as aws #「pulumi_terraform」モジュールのpathを明示的に指定 (必要な場合のみ) import sys sys.path.append('<path to pulumi_terraform module>') import pulumi_terraform as terraform bucket_state = terraform.state.RemoteStateReference( 'myBucket', backend_type='local', args=terraform.state.LocalBackendArgs(path='../terraform-aws-s3/terraform.tfstate')) bucket_name = bucket_state.get_output('bucket_id') bucket_object = aws.s3.BucketObject( 'myBucketObject', bucket=bucket_name, source=pulumi.FileAsset("sample.txt")) pulumi.export("bucketName", bucket_name)
【Pulumi Program(__main__.py)】 - Objectとして作成するファイルをローカルに用意します。
$ echo "test" > sample.txt
- pulumi upを実行して、リソースをデプロイします。
$ pulumi up Previewing update (dev) View in Browser (Ctrl+O): https://app.pulumi.com/CL_Kenneth/pulumi-migrate/dev/previews/*** Downloading plugin: 181.40 MiB / 181.40 MiB [======================] 100.00% 18s [resource plugin aws-6.9.0] installing Type Name Plan + pulumi:pulumi:Stack pulumi-migrate-dev create + └─ aws:s3:BucketObject myBucketObject create Outputs: bucketName: "tf-bucket-8o8ezl7s" Resources: + 2 to create Do you want to perform this update? yes Updating (dev) View in Browser (Ctrl+O): https://app.pulumi.com/CL_Kenneth/pulumi-migrate/dev/updates/1 Type Name Status + pulumi:pulumi:Stack pulumi-migrate-dev created (1s) + └─ aws:s3:BucketObject myBucketObject created (0.41s) Outputs: bucketName: "tf-bucket-8o8ezl7s" Resources: + 2 created Duration: 6s
実行結果からも分かる通り、outputとしてterraform stateファイルから取得したbucket_idが設定されていることが確認できます。Outputs: bucketName: "tf-bucket-8o8ezl7s"
また、該当BucketにObjectが無事作成されていることが確認できます。
連載バックナンバー
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入門