Deploying Cloud Resources with Pulumi and LocalStack

Pulumi AWS LocalStack golang

2 min read | by Jordi Prats

Pulumi is a powerful infrastructure as code tool that allows developers to deploy and manage cloud resources using familiar programming languages. However, when it comes to using Pulumi with LocalStack, there are some changes that need to be made to make Pulumi be able to reach LocalStack.

We will be utilizing the following Golang code (full project available in github) to create an S3 bucket on AWS, although our intention is to use it to create a bucket on LocalStack:

package main

import (

func main() {
  pulumi.Run(func(ctx *pulumi.Context) error {
    bucket, err := s3.NewBucket(ctx, "my-bucket", nil)
    if err != nil {
      return err

    ctx.Export("bucketName", bucket.Bucket)
    return nil

In order to configure pulumi to reach LocalStack we'll have to edit the Pulumi.test.yaml file with the following:

  aws:region: us-east-1
  aws:accessKey: test
  aws:secretKey: test
    - s3: http://localhost:4566
    - cloudwatch: http://localhost:4566
    - cloudwatchlogs: http://localhost:4566
    -  dynamodb: http://localhost:4566
    - iam: http://localhost:4566
    - lambda: http://localhost:4566
    - secretsmanager: http://localhost:4566
    - sns: http://localhost:4566
    - sqs: http://localhost:4566
  aws:s3_force_path_style: true
  aws:skipCredentialsValidation: true
  aws:skipRequestingAccountId: true

For this example we just really need the s3 endpoint. With this file updated, we can use pulumi up as usual:

$ pulumi up
Previewing update (test)

View in Browser (Ctrl+O):

     Type                 Name          Plan
     pulumi:pulumi:Stack  s3-demo-test
 +   └─ aws:s3:Bucket     my-bucket     create

  + bucketName: "my-bucket-0035d8a"

    + 1 to create
    1 unchanged

Do you want to perform this update? yes
Updating (test)

View in Browser (Ctrl+O):

     Type                 Name          Status
     pulumi:pulumi:Stack  s3-demo-test
 +   └─ aws:s3:Bucket     my-bucket     created (0.41s)

  + bucketName: "my-bucket-d016c02"

    + 1 created
    1 unchanged

Duration: 4s

We can validate that it has created the S3 bucket using LocalStack by checking it with awslocal:

$ awslocal s3 ls
2023-04-22 12:02:34 my-bucket-d016c02

Posted on 25/04/2023