Pulumi を利用し、AWSリソースをデプロイするチュートリアルを触ってみた

Pulumi というサービスを理解するため、AWSにリソースをデプロイするチュートリアルしてみました(初心者向け)
2023.04.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Pulumi AIが利用できるようになり、Pulumiというサービスが気になったので、Pulumiのチュートリアルを触ってみます。

以下の流れで、Pulumiを利用し、AWSにリソースをデプロイします。

  1. AWSアカウントにアクセスするためのPulumiのセットアップと設定。
  2. 新しいPulumiプロジェクトを作成する。(yamlを使用)
  3. 新しいAWS S3バケットをプロビジョニングします。
  4. バケットにindex.htmlファイルを追加し、静的ウェブサイトとして提供します。
  5. プロビジョニングしたリソースを破棄して、デプロイメントをクリーンアップします。

事前準備

  • AWSのアクセスキーとシークレットキーを取得しておく

Pulumi プロジェクトの作成

Macの場合、Homebrewをインストール済みであれば、terminalに以下のコマンドで Pulumiをインストールします

$ brew install pulumi/tap/pulumi

Pulumi 用のディレクトリを作成後、pulumi new aws-yamlで、Pulumiのプロジェクトをyamlで作成します。

Pulumiのアカウントを作成していない場合、エンターを押した後、ブラウザに遷移し、アカウント作成をする必要があります。

$ mkdir quickstart && cd quickstart

quickstart/ $ pulumi new aws-yaml

Manage your Pulumi stacks by logging in.
Run `pulumi login --help` for alternative login options.
Enter your access token from https://app.pulumi.com/account/tokens
    or hit <ENTER> to log in using your browser  :

ちなみに、pulumi new aws-yamlを実行する際、実行時内のディレクトリは、空でなければエラーになります

quickstart/ $ error: /xxxx/quickstart is not empty; rerun in an empty directory, pass the path to an empty directory to --dir, or use --force

アカウント作成後、terminalに戻ると、以下の4つを入力することを求められますので、それぞれ入力しました

  • プロジェクト名
    • quickstart
  • プロジェクトの概要文
    • Test
  • スタック名
    • dev
  • デプロイしたいリージョン
    • ap-northeast-1

今回は、以下を入力しました

project name: (quickstart) quickstart
project description: (A minimal AWS Pulumi YAML program) Test
Created project 'quickstart'

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) dev
Created stack 'dev'

aws:region: The AWS region to deploy into: (us-east-1) ap-northeast-1

作成されたファイル

pulumi new aws-yamlを実行し作成されたファイルは2つです。

  • Pulumi.yaml
    • リソースを管理するプロジェクトとプログラムの両方を定義します。
  • Pulumi.dev.yaml
    • 初期化したばかりのスタックの構成値が含まれています。

Pulumi.yaml

name: quickstart
runtime: yaml
description: Test
outputs:
  # Export the name of the bucket
  bucketName: ${my-bucket.id}
resources:
  # Create an AWS resource (S3 Bucket)
  my-bucket:
    type: aws:s3:Bucket

Pulumi.dev.yaml

config:
  aws:region: ap-northeast-1

Pulumi.yamlのコードの内容は、新しい S3 バケットを作成し、バケットの名前をエクスポートするようです。

スタックをデプロイ

事前に作成したアクセスキーとシークレットキーが設定されていることを確認し、pulumi upでスタックをデプロイします。

Do you want to perform this update?と聞かれると以下の3つの選択肢がでますので、yesを選択します。

  • details
    • 変更点の差分が表示されます
  • yes
    • スタックをデプロイします
  • no
    • 更新操作を実行せずにユーザープロンプトに戻ります
$ aws configure
AWS Access Key ID [None]: XXXX
AWS Secret Access Key [None]: XXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:

quickstart/ $ pulumi up

Do you want to perform this update? yes

Updating (dev)

View in Browser (Ctrl+O): https://app.pulumi.com/HiraiYuji/quickstart/dev/updates/3

     Type                 Name            Status           
     pulumi:pulumi:Stack  quickstart-dev                   
 +   └─ aws:s3:Bucket     my-bucket       created (2s)     


Outputs:
  + bucketName: "my-bucket-584944b"

Resources:
    + 1 created
    1 unchanged

Duration: 3s

my-bucket-584944bというバケット名で作成されました

Outputsの内容は、下記コマンドで確認できます。

quickstart/ $ pulumi stack output bucketName
my-bucket-584944b

スタックの変更

スタックを変更します。

まず、S3バケットに追加するindex.htmlを追加します。

quickstart/ $ echo '<html>
    <body>
        <h1>Hello, Pulumi!</h1>
    </body>
</html>' > index.html

index.htmlをS3バケットに追加するためには、PulumiのFileAssetリソースを使用します

Pulumi.yamlファイルを以下に書き換えます。

name: quickstart
runtime: yaml
description: Test

resources:
  my-bucket:
    type: aws:s3:Bucket

  index.html:
    type: aws:s3:BucketObject
    properties:
      bucket: ${my-bucket}
      source:
        fn::fileAsset: ./index.html

outputs:
  bucketName: ${my-bucket.id}

このバケットオブジェクトは、バケットオブジェクトのプロパティでバケット名を参照しているため(14行目)、先程デプロイしたBucketの一部となります。

次に、変更した内容をデプロイします。

quickstart/ $ pulumi up

indexl.htmlが追加されていました。

quickstart/ $ aws s3 ls $(pulumi stack output bucketName)
2023-04-23 11:50:33         70 index.html

静的ウェブサイトに変更

インターネット上でアクセスできるようにするための調整を行います。

Pulumi.yamlファイルを以下に書き換えます。

Pulumi.yaml

name: quickstart
runtime: yaml
description: A minimal AWS Pulumi YAML program

resources:
  my-bucket:
    type: aws:s3:Bucket
    properties:
      website:
        indexDocument: index.html

  ownership-controls:
    type: aws:s3:BucketOwnershipControls
    properties:
      bucket: ${my-bucket.id}
      rule:
        objectOwnership: ObjectWriter

  public-access-block:
    type: aws:s3:BucketPublicAccessBlock
    properties:
      bucket: ${my-bucket.id}
      blockPublicAcls: false

  index.html:
    type: aws:s3:BucketObject
    properties:
      bucket: ${my-bucket.id}
      source:
        fn::fileAsset: ./index.html
      contentType: text/html
      acl: public-read
    options:
      dependsOn:
        - ${public-access-block}

outputs:
  bucketName: ${my-bucket.id}
  bucketEndpoint: http://${my-bucket.websiteEndpoint}

デプロイし、アクセスすると、index.htmlがレスポンスされることを確認できました!

quickstart/ $ pulumi up
quickstart/ $ curl $(pulumi stack output bucketEndpoint)
<html>
    <body>
        <h1>Hello, Pulumi!</h1>
    </body>
</html>

スタックを削除する

スタックを下記コマンドで削除できる

quickstart/ $ pulumi destroy

バケットは、削除されました。

スタック内のリソースは削除されましたが、スタックに関連付けられた履歴と構成は引き続き維持されます。

スタックを完全に削除したい場合は、pulumi stack rm devを実行します。

quickstart/ $ pulumi stack rm dev
This will permanently remove the 'dev' stack!
Please confirm that this is what you'd like to do by typing `dev`: dev
Stack 'dev' has been removed!

最後に

チュートリアルの説明通りに進めることで、特に詰まることなくデプロイまで体験することができました。

次は、Pulumi AIを触ってみたいと思います!

Pulumi AIを試したブログを作成しました。興味があれば一読ください、