連載 [第2回] :
今日からはじめる Pulumiでカンタン インフラ運用・管理PulumiでAWSリソースをデプロイしよう
2023年3月15日(水)
第2回となる今回は、Pulumiのアカウント作成からAWSリソースの作成まで、ハンズオンを通して一通り実践していきます。
【ハンズオン】AWSリソースの作成
以降では、いよいよ実際にPulumiを利用してAWSリソースを作成していきます。基本的にはローカルPCのCLI(macOSであればターミナル、Windowsであればコマンドプロンプトなど)で作成作業を進め、作成後の確認はAWSマネジメントコンソールやAWSリソースへの直接アクセス、作業の履歴などはPulumi Serviceのコンソール画面から確認します。
Pulumi Project/Stackの新規作成
Pulumi CLIを用いて、新しいPulumi ProjectとStackを作成します。
- Pulumi Project用のディレクトリを作成します。ディレクトリ名はお好みで問題ありませんが、次に実施するPulumi Project作成コマンドでディレクトリ名がProject名として参照されるようになります(コマンド実施時に別のProject名を指定することも可能)。ここでは「pulumi-test」をディレクトリ名とProject名に設定します。
$ mkdir pulumi-test && cd pulumi-test
- Pulumi Project作成コマンド「pulumi new <テンプレート名>」を実行します。今回はpythonでAWSリソースを作成するため、テンプレート名は「aws-python」のようになります。テンプレート名を正しく設定し、以降のプロンプトでProject名やStack名などを指定すると、AWSリソースの作成に必要な基本的な設定ファイル(Project定義ファイル、Stack設定ファイルなど)が作成されます。
$ 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.
【参考】Pulumi Project Templateの選択
PulumiはGoやPythonなど複数の汎用言語に対応し、かつGCPやAWSなど70以上のクラウドやサービスにも対応しているため、言語とサービスの組み合わせとなるテンプレート数も豊富にあります。テンプレート名が分からない場合は引数を指定せず「pulumi new」コマンドを実行すると以下のようにテンプレート一覧が表示され、この中から目的のテンプレートを選択できます。
$ pulumi new Please choose a template (38/206 shown): [Use arrows to move, type to filter] aiven-go A minimal Aiven Go Pulumi program aiven-python A minimal Aiven Python Pulumi program 〜〜(略)〜〜 aws-fsharp A minimal AWS F# Pulumi program aws-go A minimal AWS Go Pulumi program aws-java A minimal AWS Java Pulumi program aws-javascript A minimal AWS JavaScript Pulumi program aws-native-csharp A minimal AWS C# Pulumi program aws-native-fsharp A minimal AWS F# Pulumi program aws-native-go A minimal AWS Go Pulumi program aws-native-javascript A minimal AWS JavaScript Pulumi program aws-native-python A minimal AWS Python Pulumi program aws-native-typescript A minimal AWS TypeScript Pulumi program aws-native-visualbasic A minimal AWS VB.NET Pulumi program aws-native-yaml A minimal AWS Pulumi YAML program > aws-python A minimal AWS Python Pulumi program 〜〜(略)〜〜
- 「pulumi new <テンプレート名>」コマンド実行後は「Pulumi Project名(project name)」「Pulumi Projectの説明(project description)」「Pulumi Stack名(stack name)」「AWSのデフォルトリージョン(aws:region)」をプロンプトに従って設定していきます。各項目右の括弧内の値は、特に指定がない場合のデフォルト値を示します。ここでは「Pulumi Project名(project name)」「Pulumi Projectの説明(project description)」「Pulumi Stack名(stack name)」はデフォルト値を設定するため、各プロンプトでそのまま<ENTER>を押下し、「AWSのデフォルトリージョン(aws:region)」では「アジアパシフィック(東京)」に設定するため「ap-northeast-1」を設定してから<ENTER>を押下しました。
project name: (pulumi-test) project description: (A minimal AWS Python Pulumi program) Created project 'pulumi-test' Please enter your desired stack name. To create a stack in an organization, use the format <org-name>/<stack-nameGgt; (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
以降は自動的にPulumiの実行に必要なファイルやpythonのdependenciesなどが自動的にインストール/作成され、Pulumi ProjectおよびStackの作成が完了します。
Installing dependencies... Creating virtual environment... Finished creating virtual environment Updating pip, setuptools, and wheel in virtual environment... Requirement already satisfied: pip in ./venv/lib/python3.9/site-packages (22.1.1) Collecting pip Downloading pip-23.0-py3-none-any.whl (2.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.1/2.1 MB 946.6 kB/s eta 0:00:00 Requirement already satisfied: setuptools in ./venv/lib/python3.9/site-packages (62.3.2) Collecting setuptools Downloading setuptools-67.1.0-py3-none-any.whl (1.1 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 849.7 kB/s eta 0:00:00 Collecting wheel 〜〜(略)〜〜 Stored in directory: /Users/k-ozeki/Library/Caches/pip/wheels/84/38/38/9dfb70fc95d96ee1d841fd0729f2a738abfd7a72d4beb2ffa5 Successfully built pulumi-aws Installing collected packages: arpeggio, typing-extensions, six, semver, pyyaml, protobuf, dill, attrs, parver, grpcio, pulumi, pulumi-aws Successfully installed arpeggio-2.0.0 attrs-22.2.0 dill-0.3.6 grpcio-1.50.0 parver-0.4 protobuf-4.21.12 pulumi-3.53.1 pulumi-aws-5.29.1 pyyaml-6.0 semver-2.13.0 six-1.16.0 typing-extensions-4.4.0 Finished installing dependencies Finished installing dependencies Your new project is ready to go! ✨ To perform an initial deployment, run `pulumi up`
ちなみに、この時点でPulumi Service画面にて、左ナビゲーションメニュー[Stacks]から作成したPulumi ProjectおよびStackを確認できます。
今回作成したProjectのStack名(dev)をクリックすると、そのStackの概要(tag/secretの管理状況など)や変更履歴などが確認できます。[Activity]タブからリソースの作成/変更/削除などの履歴が確認できますが、現時点ではAWSリソースは作成していないため「No Updates」と表示されています。
【参考】Pulumi関連ファイル
次に進む前に、ここで「pulumi new」コマンドで作成されたファイルを確認してみます。
$ ls -F Pulumi.dev.yaml Pulumi.yaml __main__.py requirements.txt venv/
- Pulumi.yaml
→ Pulumi Projectのメタデータが記述されたファイルです。Project自体は「Pulumi.yaml」ファイルと、各開発言語(runtime)に対応したエントリーポイントとなるファイル(Pythonなら「__main__.py」、Goなら「main.go」など)が含まれるディレクトリ自体を指します。「pulumi new」コマンド実行時のプロンプトで設定したProject名やProjectの説明文も、自動的にこのファイルへ記述されます。後からファイルを編集して、Projectの他の設定やオプションを追加することも可能です。ファイル内の各項目(属性)の詳細はこちらで確認できます。
$ cat Pulumi.yaml name: pulumi-test runtime: name: python options: virtualenv: venv description: A minimal AWS Python Pulumi program
- __main__.py
→ Pulumi Programとなり、インフラストラクチャのあるべき姿を定義します。Pythonなら「__main__.py」、Goなら「main.go」など、開発言語(runtime)によりファイル名は異なります。「pulumi new」コマンド実行直後は「pulumi up(インフラ作成コマンド)」実行時のエントリーポイントとなるProgramが作成され、簡単なコードのサンプルがファイル内に記述されます。必要に応じてファイルを編集したり、また別ファイルとしてProgramを新たに用意してサブフォルダに格納し、モジュールのようにimportさせるなど、通常のアプリケーション開発のように複数のProgramを組み合わせることができます。Programを作成する際に参照する、各クラウドプロバイダのAPIドキュメントはこちらから確認できます。
$ cat __main__.py """An AWS Python Pulumi program""" import pulumi from pulumi_aws import s3 # Create an AWS resource (S3 Bucket) bucket = s3.Bucket('my-bucket') # Export the name of the bucket pulumi.export('bucket_name', bucket.id)
今回「pulumi new」で生成されたProgramでは、サンプルコードとして「my-bucket」が名称のS3 Bucketと、Stack間での共有やCLIで値を出力できるBucket名をStack outputとしてexportします。 - Pulumi.dev.yaml
→ Pulumi Stackのkey-value形式の設定ファイルです。ここでは「pulumi new」コマンド実行時のプロンプトでStack名を「dev」に設定したので、ファイル名は「Pulumi.dev.yaml」となります。Stack名が「stg」なら「Pulumi.stg.yaml」となるように、Stackの設定ファイルは「Pulumi.(Stack名).yaml」のフォーマットとされています。1つのProjectに複数のStackを作成できますが、例えばAWS EC2を開発環境や本番環境用など、それぞれのStackでスペックを変えたいときなどは、このStackの設定ファイルにスペックの値を記述してProgramで値を読み込ませることで、Stackごとにリソースの差異を発生させることができます。
$ cat Pulumi.dev.yaml config: aws:region: ap-northeast-1
ちなみに、Stackの設定はPulumi CLI(pulumi configコマンド)からも設定可能です。以下のコマンドを実行すると、自動的にStackの設定ファイルにもkey-value形式で値が追加されます。コマンドの詳細はこちらで確認できます。
$ pulumi config set key1 value1 $ cat Pulumi.dev.yaml config: aws:region: ap-northeast-1 pulumi-test:key1: value1
- requirements.txt
- venv/
→ 開発言語(runtime)特有のファイル(ディレクトリ)です。ここではPythonを利用しているため、Pythonパッケージのバージョンを指定してインストールする「requirements.txt」や、Pythonの仮想環境である「venv/」がPulumiにより自動的に作成されました。
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。
全文検索エンジンによるおすすめ記事
- 既に存在するリソースをPulumiで管理してみよう
- Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう
- 「Pulumi Stack」とは ー Pulumiによるマルチステージ環境の構築方法
- TerraformからPulumiへの移行
- 「Pulumi Automation API」でPulumi CLIの機能をコード化しよう
- SecretもPulumiで使いこなしたい! PulumiのSecurityを試してみよう
- Pulumi Kubernetes Operatorを活用してPulumiのCI/CDを実現しよう
- Pulumiの最新機能「Pulumi ESC」を使ってみよう
- Oracle Cloud Hangout Cafe Season7 #2「IaC のベストプラクティス」(2023年7月5日開催)
- Infrastructure-as-Codeアプローチと「Pulumi」の概要