🏆 升级!使用 Pulumi IaC 在 AWS 云上部署游戏 | 📢 包含完整的分步视频演示 升级!使用 Pulumi IaC 在 AWS 云上部署游戏 - Pulumi 部署和文档挑战

2025-05-27

🏆 升级!使用 Pulumi IaC 在 AWS 云上部署游戏 | 📢 包含完整的分步视频演示

升级!使用 Pulumi IaC 在 AWS 云上部署游戏 - Pulumi 部署和文档挑战

这是Pulumi 部署和文档挑战赛的提交内容:快速静态网站部署

我提交此文的目的

作为一名经验丰富的专业人士和使用 Pulumi 的基础设施即代码 (IaC) 的坚定倡导者,我的目标是展示在您最喜欢的云平台上使用 Pulumi 部署基础设施是多么简单和直接——使用任何通用编程语言。

在过去的几天里,我探索了10到20种不同的应用程序和部署思路,以找到最简单但最有效的方法。我的目标是创建一个易于理解的解决方案,即使对于编程、云平台或Pulumi等IaC工具背景很少或完全没有的初学者来说也是如此。本次演示将重点介绍一个完整的、循序渐进的流程,使任何人都可以开始使用Pulumi以代码形式配置云服务。根据Pulumi的文档,它支持超过170家云和SaaS提供商,让用户可以灵活地使用他们喜欢的工具和平台。

图片描述

目录

我建造的东西——颜色回忆挑战游戏

因此,我开发了一款简洁优雅的单页色彩回忆游戏,旨在挑战用户的色彩记忆和视觉回忆能力。这款适合初学者的游戏设计为静态网站,旨在演示如何使用 Pulumi 和基础设施即代码 (IaC) 快速轻松地部署静态网站。

游戏包含10个难度递增的关卡。随着关卡的推进,用户需要记住和回忆的颜色数量也会随之增加。如果用户选错了颜色,游戏就会结束——这为游戏体验增添了趣味十足、引人入胜的挑战。


颜色回忆挑战演示视频

现场演示链接

-CloudFront URL (https) CloudFront URL
-S3 Bucket 公共访问 URL (http) S3 Bucket 公共 URL

项目回购

GitHub 徽标 穆罕默德尼扎德/ pulumi-挑战

该存储库专用于 Pulumi IaC 快速网站部署挑战赛的托管项目

升级!使用 Pulumi IaC 在 AWS 云上部署游戏 - Pulumi 部署和文档挑战

这是 Pulumi 部署和文档挑战赛的提交内容:快速静态网站部署

标识

客观的

作为基础设施即代码 (IaC) 的倡导者,我的目标是展示使用Pulumi部署云基础设施是多么轻松高效。在这个项目中,我使用Pulumi在 AWS 上部署了一个静态网站(颜色回忆挑战游戏)。目标是展示 Pulumi IaC 在使用您最喜欢的编程语言(在本例中是Python )以编程方式部署云服务方面的强大功能

我建造的东西——颜色回忆挑战游戏

我开发了一个简洁优雅的单页色彩回忆游戏,旨在挑战用户的色彩记忆和视觉回忆能力。它设计为静态网站,旨在展示如何使用 Pulumi 快速部署静态网站。

我的旅程 - 使用 Pulumi 将色彩挑战游戏投入生产

⚠️ 假设:本分步指南假设您从全新安装的 Windows 开始。如果您使用的是其他操作系统,请参阅 Pulumi 官方入门指南,了解针对您操作系统的具体说明。

如果您已具备以下列出的任何工具或要求,请跳过这些步骤。如果没有,请务必先安装或设置它们,然后再继续操作。

🚨 如果您使用以下列出的服务,则遵循本教程无需支付任何费用。本教程中使用的所有内容均免费,并且我会明确说明任何可能需要付费的例外情况。

📢 先决条件

1️⃣一个有效的电子邮件帐户(即 gmail:在此创建一个
2️⃣ Pulumi 帐户(在此免费注册
) 3️⃣访问云平台(即 AWS:在此注册一个免费的 AWS 帐户)。
注意:虽然部署此演示不会花费,因为它属于免费套餐,但超过免费套餐配额将花费您。4️⃣ AWS命令​​行界面(CLI)从此处下载并安装
) 5️⃣ VS Code下载并安装Visual Studio Code)(如果您尚未安装它) 6️⃣语言运行时:此外,我们需要适当的语言运行时来运行代码。在此示例中,我将使用 Python。因此,让我们使用此处的链接安装 Python 。

👉 步骤 01 - 安装 Pulumi

一切设置完成后,我们可以使用 Windows PowerShell安装Pulumi CLI工具。

为此,请以管理员模式打开 Windows PowerShell 并运行以下命令:

choco install pulumi
Enter fullscreen mode Exit fullscreen mode

然后按Enter 键。系统会要求你确认是否允许运行安装程序——请继续并允许其继续。

现在,输入Yes并按Enter 键。Pulumi 将开始顺利安装,如下所示。

使用 Windows PowerShell 安装 Pulumi

要检查Pulumi是否安装成功,请再次打开 PowerShell,输入以下命令,然后按Enter

pulumi version
Enter fullscreen mode Exit fullscreen mode

如果一切设置正确,您应该会看到显示的 Pulumi 版本,如下所示。

验证Pulumi安装

步骤 01 的视频演示

👉步骤02-使用所需凭证创建AWS IAM用户

安装Pulumi后,我们需要授予其部署和管理云资源所需的权限。为此,Pulumi需要使用适当的访问凭据进行编程访问。

在这种情况下,我们需要创建具有正确权限的 AWS Identity and Access Management (IAM) 用户。

因此,让我们创建一个 IAM 用户,Pulumi 可以使用它来管理我们云平台上的服务。

我们将创建一个名为 pulumi-user 的新 IAM 用户,并将以下策略附加到它:

  • AdministratorAccess:此策略提供对 AWS 服务和资源的完全访问权限。
  • AmazonS3FullAccess:此策略通过 AWS 管理控制台提供对所有存储桶的完全访问权限。

步骤 02:如何创建 IAM 用户pulumi-user 的视频演示

现在一切都已设置完毕,Pulumi 可以以编程方式成功部署和管理 AWS 服务。

接下来,我们将颜色挑战游戏部署到 S3 存储桶。我们还将把它设置为静态网站,并使用 CloudFront 进行交付。


使用 Pulumi - 将色彩挑战游戏部署到 AWS S3 存储桶

👉 步骤 03-将色彩挑战游戏部署到 AWS S3 存储桶

👉 1.创建项目目录

  • 打开 VS Code ▶️ 从顶部菜单中,转到终端并单击新建终端。或者,您可以使用快捷键Ctrl + Shift + '快速打开终端。

  • 打开终端后,运行以下命令创建并导航到color-code-challenge目录:

cd desktop
mkdir color-challenge-code
cd color-challenge-code
Enter fullscreen mode Exit fullscreen mode

图片描述

👉 2. 登录 Pulumi

  • 登录你的 Pulumi 账户。这将打开你的浏览器进行身份验证。

  • 运行以下命令:

pulumi login
Enter fullscreen mode Exit fullscreen mode

图片描述

👉 3.使用 AWS 和 Python 作为堆栈初始化一个新的 Pulumi 项目。

  • 要初始化新的 pulumi 项目,请运行以下代码:
pulumi new aws-python
Enter fullscreen mode Exit fullscreen mode

系统会提示您几个问题。您可以直接按 Enter 接受默认值,或者根据需要输入您自己的首选值。

图片描述

pulumi new命令根据指定的云和语言创建一个新的 Pulumi 项目,其中包含一些基本的脚手架。

图片描述

👉 4.配置AWS CLI凭证

运行以下命令来提供我们在步骤 02中创建的AWS 凭证访问密钥秘密访问密钥) 。

这将允许Pulumi访问您的 AWS 帐户并将网站部署到S3 存储桶

aws configure
Enter fullscreen mode Exit fullscreen mode

图片描述

在Visual Studio Code使用aws configure 命令可以设置 AWS 凭证和区域。VS Code 扩展程序随后会使用这些设置与 AWS 资源进行交互。

👉 4.1. 将项目文件夹添加到 VS Code 工作区

VS Code中,转到文件菜单并选择将文件夹添加到工作区

图片描述

将出现一个名为“将文件夹添加到工作区”的对话框。从那里,选择“Color-Challenge-Game”文件夹,然后单击“添加”按钮。

图片描述

现在,打开__ main.py __文件。默认的__ main.py __文件应该包含以下代码:

"""An AWS Python Pulumi program"""

import pulumi
from pulumi_aws import s3

# Create an AWS resource (S3 Bucket)
bucket = s3.BucketV2('my-bucket')

# Export the name of the bucket
pulumi.export('bucket_name', bucket.id)

Enter fullscreen mode Exit fullscreen mode

用以下代码替换现有代码(您也可以在 GitHub repo 中找到该文件),然后保存该文件。

# This script creates an S3 bucket for a static website, uploads the website files to the bucket
# and sets up a CloudFront distribution to serve the website.
# It also configures the bucket policy to allow public access to the files.
# The website files should be placed in the './www' directory relative to this script.

import os
import mimetypes
import pulumi
import pulumi_aws as aws

# Create an S3 bucket for the website
statis_website_bucket = aws.s3.Bucket("color-challenge-website-bucket",
    website=aws.s3.BucketWebsiteArgs(
        index_document="index.html",
    ))

# Bucket policy to allow public access to the website files
public_access_block = aws.s3.BucketPublicAccessBlock('color-challenge-bucket-public-access-block',
    bucket=statis_website_bucket.id,
    block_public_acls=False,
    ignore_public_acls=False,
    block_public_policy=False,
    restrict_public_buckets=False
)

# Bucket policy to allow public read access to the bucket
# Note: This is a simplified policy. In production, consider using more restrictive policies.
bucket_policy = aws.s3.BucketPolicy("bucket-policy",
    bucket=statis_website_bucket.id,
    policy=statis_website_bucket.id.apply(
        lambda id: f"""{{
            "Version": "2012-10-17",
            "Statement": [{{
                "Effect": "Allow",
                "Principal": "*",
                "Action": ["s3:GetObject"],
                "Resource": ["arn:aws:s3:::{id}/*"]
            }}]
        }}"""
    ))


# Function to upload files and directories to S3
def upload_directory(directory_path, parent_path=""):
    for item in os.listdir(directory_path):
        item_path = os.path.join(directory_path, item)
        if os.path.isdir(item_path):
            upload_directory(item_path, os.path.join(parent_path, item))
        else:
            # Get the content type of the file
            file_path = os.path.join(parent_path, item)
            content_type = mimetypes.guess_type(item_path)[0] or "application/octet-stream"

            aws.s3.BucketObject(
                file_path.replace("\\", "/"),
                bucket=statis_website_bucket.id,
                key=file_path.replace("\\", "/"),
                source=pulumi.FileAsset(item_path),
                content_type=content_type
            )

# Upload the website files to the S3 bucket
website_dir = "./www"
if os.path.exists(website_dir):
    upload_directory(website_dir)
else:
    print(f"Error: Website directory {website_dir} does not exist")

# Create a CloudFront distribution for the S3 bucket
cdn = aws.cloudfront.Distribution("website-cdn",
    enabled=True,
    origins=[aws.cloudfront.DistributionOriginArgs(
        origin_id=statis_website_bucket.arn,
        domain_name=statis_website_bucket.website_endpoint,
        custom_origin_config=aws.cloudfront.DistributionOriginCustomOriginConfigArgs(
            http_port=80,
            https_port=443,
            origin_protocol_policy="http-only",
            origin_ssl_protocols=["TLSv1.2"],
        ),
    )],
    default_cache_behavior=aws.cloudfront.DistributionDefaultCacheBehaviorArgs(
        target_origin_id=statis_website_bucket.arn,
        viewer_protocol_policy="redirect-to-https",
        allowed_methods=["GET", "HEAD", "OPTIONS"],
        cached_methods=["GET", "HEAD", "OPTIONS"],
        forwarded_values=aws.cloudfront.DistributionDefaultCacheBehaviorForwardedValuesArgs(
            query_string=False,
            cookies=aws.cloudfront.DistributionDefaultCacheBehaviorForwardedValuesCookiesArgs(
                forward="none",
            ),
        ),
        min_ttl=0,
        default_ttl=3600,
        max_ttl=86400,
    ),
    price_class="PriceClass_100",
    restrictions=aws.cloudfront.DistributionRestrictionsArgs(
        geo_restriction=aws.cloudfront.DistributionRestrictionsGeoRestrictionArgs(
            restriction_type="none",
        ),
    ),
    viewer_certificate=aws.cloudfront.DistributionViewerCertificateArgs(
        cloudfront_default_certificate=True,
    ))

# Export the Bucket Name, website URL and CDN URL
pulumi.export("bucket_name", statis_website_bucket.id)
pulumi.export("website_url", statis_website_bucket.website_endpoint)
pulumi.export("cdn_url", cdn.domain_name)

# END OF FILE
# This script creates an S3 bucket for a static website, uploads the website files to the bucket
# and sets up a CloudFront distribution to serve the website. 
# It also configures the bucket policy to allow public access to the files.
# The website files should be placed in the './www' directory relative to this script.
Enter fullscreen mode Exit fullscreen mode

接下来,从 GitHub 存储库下载www文件夹并将其移动到Color-Challenge-Game项目目录中。

注意:您可以将任何静态网站(及其文件和文件夹)放置在Color-Challenge-Game项目内的 www 文件夹中,它将正常运行。

现在我们已经完成了所有步骤,我们的项目已经准备好部署了。检查文件夹目录,确保它与下图所示的结构相匹配。

图片描述

👉 5.预览部署

运行以下代码以预览部署。这将列出将要创建的资源。

pulumi preview
Enter fullscreen mode Exit fullscreen mode

输出如下:

图片描述

👉 6.部署基础设施

运行以下代码并选择“是”以部署Color-Challenge-Game项目网站。

pulumi up
Enter fullscreen mode Exit fullscreen mode

部署已成功完成,如下所示。

图片描述

部署成功后,您将获得两个链接:

打开CloudFront URL以获得最佳性能和 HTTPS 支持。

👉 7. 销毁Pulumi提供的资源

要删除 Pulumi 提供的所有内容,只需运行以下代码:

pulumi destroy
Enter fullscreen mode Exit fullscreen mode

要删除堆栈,请运行以下代码:

pulumi stack rm
Enter fullscreen mode Exit fullscreen mode

本教程总结了如何使用Pulumi IaCAWS S3 Bucket上部署静态网站并通过CloudFront进行配置的分步、适合初学者的教程

将颜色挑战游戏部署到 AWS S3 存储桶的步骤 03 从1 到 7的视频演示


Pulumi 使用反思及最佳实践

*文档:*优秀产品的独特之处在于其清晰且条理清晰的文档。Pulumi 的官方文档就是一个很好的例子——它内容全面,对初学者友好,即使没有任何经验,任何人都可以轻松上手。

从小型模块化项目入手。首先
配置一些简单的资源,例如 S3 存储桶或 EC2 实例。这有助于您熟悉 Pulumi 的语法和工作流程。模块化代码使大型项目中的组件调试、扩展和复用更加轻松。

严格使用版本控制
将所有 Pulumi 代码置于版本控制之下(例如 Git)。这样可以更轻松地跟踪变更、与团队成员协作,并在需要时实现回滚功能。结合 Pulumi 的 Pulumi 预览功能,您可以在部署前了解变更的影响。

保护您的机密信息
始终使用 Pulumi 内置的机密信息管理功能来管理 API 密钥、访问令牌和凭证。切勿对敏感值进行硬编码。您可以使用 pulumi config set --secret 命令以加密形式安全地存储值。

利用 Pulumi 堆栈进行环境管理
为每个环境创建不同的堆栈(例如,开发、预发布、生产)。这种分离可以降低风险,实现安全的实验,并确保一个环境中的更改不会意外影响另一个环境。

使用有意义的资源名称和标签
为资源分配清晰一致的名称和标签。这可以提高可追溯性,使资源计费更易于理解,并简化云控制台中的管理。

利用跨语言支持
Pulumi 允许您使用熟悉的语言(例如 Python、TypeScript、Go 和 .NET)编写 IaC。选择最适合您团队技能的语言,以加快开发速度并缩短学习曲线。

**在高级场景中使用自动化 API
**如果您正在构建开发人员平台或 CI/CD 集成,Pulumi 的自动化 API 允许您将 IaC 直接嵌入到应用程序中,从而增强控制和可扩展性。

在开发环境中定期销毁并重新配置。
在非生产环境中,定期销毁并重新创建基础架构,以验证代码是否准确地从头开始配置了所需的一切。这可以增强对灾难恢复和环境设置脚本的信心。

最后,如果没有 AI 集成,它就不完整:Pulumi Copilot 由 AI 驱动,它帮助我更高效地编写、理解和管理基础设施即代码 (IaC)。它利用 AI 提供智能代码建议,生成基础设施模板,并解答与 Pulumi、云服务和 IaC 最佳实践相关的问题——所有这些都在 Pulumi 的开发环境中完成。

我严重依赖 Pulumi 的 Copilot 来生成 Python 代码块,该代码块应该在 * __ main __.py *中禁用 AWS S3 存储桶公共访问阻止策略,使用以下提示的变体直到正确为止。

使用 Pulumi 创建 AWS S3 存储桶,并配置允许读取所有对象的公共存储桶策略。使用 Python 并尽可能遵循最佳安全实践。

下面的 Pulumi 生成的代码运行良好。

# Bucket policy to allow public access to the website files
public_access_block = aws.s3.BucketPublicAccessBlock('color-challenge-bucket-public-access-block',
    bucket=statis_website_bucket.id,
    block_public_acls=False,
    ignore_public_acls=False,
    block_public_policy=False,
    restrict_public_buckets=False
)

# Bucket policy to allow public read access to the bucket
# Note: This is a simplified policy. In production, consider using more restrictive policies.
bucket_policy = aws.s3.BucketPolicy("bucket-policy",
    bucket=statis_website_bucket.id,
    policy=statis_website_bucket.id.apply(
        lambda id: f"""{{
            "Version": "2012-10-17",
            "Statement": [{{
                "Effect": "Allow",
                "Principal": "*",
                "Action": ["s3:GetObject"],
                "Resource": ["arn:aws:s3:::{id}/*"]
            }}]
        }}"""
    ))

Enter fullscreen mode Exit fullscreen mode

图片描述

✨ Pulumi Copilot 代码生成的主要功能
:它可以帮助您使用您喜欢的语言(Python、TypeScript、Go 等)编写 Pulumi 程序,并为云资源提供 AI 辅助代码生成。

自然语言到代码:我们可以简单地描述我们想要的内容(例如,“使用 AWS S3 和 CloudFront 创建一个静态网站”),Copilot 将为我们生成代码。

内联指导:获取实时建议、文档链接和解释,以帮助您了解每行代码的作用。

支持多云:与 AWS、Azure、GCP 等主要云提供商以及 Pulumi 支持的 170 多种其他服务无缝协作。

适合初学者:非常适合刚接触云基础设施或 Pulumi 的开发人员——它大大缩短了学习曲线。

✅ Pulumi Copilot 脱颖而出的原因:
Pulumi Copilot 有助于将云理念更快地转化为可工作的基础设施,减少人为错误,并提高生产力——同时使 IaC 体验更加直观和易于访问。

借助 Pulumi Copilot,部署基础设施变得像描述您的想法一样简单 - 然后让 AI 完成繁重的工作。

结论

这个项目不仅展示了使用 Pulumi 和 AWS 部署静态网站的便捷高效,还展现了基础设施即代码 (IaC) 对各级开发人员的强大功能。通过使用 Pulumi 和 Python,我以简洁、模块化且可重复的方式构建并部署了一个功能齐全的静态游戏网站,该网站具有公共访问和 CDN 集成功能。

无论您是云计算新手还是经验丰富的开发人员,Pulumi 都能帮助您使用真实的编程语言和现代开发实践来管理云基础架构。希望本指南能够鼓励您进一步探索 Pulumi,并激励您轻松构建和部署自己的云原生应用程序。

我花了 4-5 天的时间来探索和试验这个奇妙的 IaC 工具 Pulumi,现在我已经爱上它了……

我非常乐意回答有关此分步指南和教程的任何问题,以使我们的 Pulumi IaC 生活更加轻松。

导航至上行

让我们使用 Pulumi 实现无缝 IaC 部署及超越

文章来源:https://dev.to/mohamednizzad/level-up-game-deployment-on-the-aws-cloud-using-pulumi-iac-pulumi-deploy-and-document-challenge-63n
PREV
2023 年让您的网站脱颖而出的 7 大配色方案
NEXT
REST API 设计参数和查询字符串使用的最佳实践