Static Website on Amazon S3 Using a Reusable Component
A static website hosted on AWS S3, using a reusable component
This example lives in the pulumi/examples repository. Check out just this directory to use it:
git clone --filter=blob:none --sparse https://github.com/pulumi/examples pulumi-examplesgit -C pulumi-examples sparse-checkout set aws-ts-s3-folder-componentcd pulumi-examples/aws-ts-s3-folder-componentThe component version of aws-ts-s3-folder. This example wraps the same S3 static website in a reusable ComponentResource that you can share with your team or the community.
A component is a logical container for physical cloud resources that controls how they are grouped in the CLI and the Pulumi Cloud console. To create one, subclass pulumi.ComponentResource (see s3folder.ts):
- The call to
super("examples:S3Folder", name, {}, opts)registers the component under anamespace:classNametype that appears inpulumi upand in Pulumi Cloud. - Each child resource passes
{ parent: this }so it nests under the component rather than the stack. - The component exposes
bucketNameandwebsiteUrlas outputs and callsregisterOutputsso consumers can correctly chain dependencies on them.
The program in index.ts then uses S3Folder like any other resource.
Prerequisites#
Deploying and running the program#
Note: some values in this example will be different from run to run. These values are indicated with ***.
-
Create a new stack:
Terminal window pulumi stack init website-component-testing -
Set the AWS region:
Terminal window pulumi config set aws:region us-west-2 -
Restore NPM dependencies:
Terminal window npm install -
Run
pulumi upto preview and deploy changes. After the preview is shown you will be prompted if you want to continue or not.Terminal window pulumi upPreviewing update (website-component-testing)Type Name Plan+ pulumi:pulumi:Stack aws-ts-s3-folder-component-website-component-testing create+ └─ examples:S3Folder pulumi-static-site create+ ├─ aws:s3:Bucket pulumi-static-site create+ ├─ aws:s3:BucketWebsiteConfiguration pulumi-static-site-config create+ ├─ aws:s3:BucketPublicAccessBlock pulumi-static-site-public-access-block create+ ├─ aws:s3:BucketObject index.html create+ ├─ aws:s3:BucketObject favicon.png create+ └─ aws:s3:BucketPolicy bucketPolicy createOutputs:bucketName: "pulumi-static-site-***"websiteUrl: "pulumi-static-site-***.s3-website-us-west-2.amazonaws.com"Resources:+ 7 to create -
To see the resources that were created, run
pulumi stack output:Terminal window pulumi stack outputCurrent stack outputs (2):OUTPUT VALUEbucketName pulumi-static-site-***websiteUrl pulumi-static-site-***.s3-website-us-west-2.amazonaws.com -
To see that the S3 objects exist, you can either use the AWS Console or the AWS CLI:
Terminal window aws s3 ls $(pulumi stack output bucketName)2024-04-20 22:52:15 13731 favicon.png2024-04-20 22:52:15 249 index.html -
Open the site URL in a browser to see both the rendered HTML and the favicon:
Terminal window pulumi stack output websiteUrlpulumi-static-site-***.s3-website-us-west-2.amazonaws.com
Clean up#
To clean up resources, run pulumi destroy and answer the confirmation question at the prompt.
Summary#
In this example you turned a static-website program into a reusable S3Folder component, deployed it, and exported the bucket name and website URL as stack outputs. From here you can package the component in its own module and reuse it across projects, or extend it to accept configuration such as the index document or a custom bucket policy.