PulumiでAWSリソースをデプロイしよう

2023年3月15日(水)
大関 研丞 (Kenneth Ozeki)
第2回となる今回は、Pulumiのアカウント作成からAWSリソースの作成まで、ハンズオンを通して一通り実践していきます。

【ハンズオン】AWSリソースの作成

以降では、いよいよ実際にPulumiを利用してAWSリソースを作成していきます。基本的にはローカルPCのCLI(macOSであればターミナル、Windowsであればコマンドプロンプトなど)で作成作業を進め、作成後の確認はAWSマネジメントコンソールやAWSリソースへの直接アクセス、作業の履歴などはPulumi Serviceのコンソール画面から確認します。

Pulumi Project/Stackの新規作成

Pulumi CLIを用いて、新しいPulumi ProjectとStackを作成します。

  1. Pulumi Project用のディレクトリを作成します。ディレクトリ名はお好みで問題ありませんが、次に実施するPulumi Project作成コマンドでディレクトリ名がProject名として参照されるようになります(コマンド実施時に別のProject名を指定することも可能)。ここでは「pulumi-test」をディレクトリ名とProject名に設定します。
    $ mkdir pulumi-test && cd pulumi-test
  2. 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
    〜〜(略)〜〜
  3. 「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により自動的に作成されました。
著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

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

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています