用途 |安全|更改日志 |附录
(alpha)一种帮助使用 Amazon Web Services (AWS) 创作静态站点的工具。
理由:静态网站很有趣。部署到 S3 是一件纯粹的快乐。 CloudFront 使扩展成为您不再考虑的事情。无需管理服务器;没有眼泪可以哭。然而,设置这一切并不那么简单。 Confetti 尝试使用 CloudFormation 将最佳实践编码到可重复的程序中,并为基本和高级部署场景提供方便的工具。
[confetti/confetti " 0.2.1 " ] ; ; latest release
创建网站 |同步您的网站 |最后一步:DNS |添加子域
五彩纸屑被打包为启动任务。这主要是因为 boot 使得在 Clojure 中编写命令行应用程序变得容易,而无需担心引导或依赖解析。
Confetti 提供了两个命令,在引导术语中称为“任务” 。 create-site
任务将创建一个包含静态网站所有资源的 CloudFormation 堆栈,并将所有重要信息保存到当前目录中的 EDN 文件中。
让我们看一下创建站点并首次同步它的示例。
对访问键感到困惑吗?查看本自述文件的安全部分。
假设您想在my-app.com
部署一个站点。要创建 S3 存储桶、CloudFront 分配和受限访问密钥,您可以运行以下命令:
boot -d confetti create-site --domain "my-app.com" --access-key XXX --secret-key YYY
注意:
-d confetti
位确保 Boot 将下载五彩纸屑,以便create-site
任务可用。
例外!因为您想使用裸域/APEX 域,所以必须使用 Route53 作为 DNS。 (您可以在附录中找到更多相关信息。)启用 DNS 后重试:
boot -d confetti create-site --domain "my-app.com" --access-key XXX --secret-key YYY --dns
这应该会启动该过程。第一个反馈应该出现在您的屏幕上。在某些时候,不会打印任何新事件,但进程也尚未返回。您现在等待的是创建 CloudFront 分配。这通常需要 10-15 分钟。
此时您可以终止该进程。一切都在远程运行,不会被中断。
.confetti.edn
文件保存在您当前的工作目录中,如果使用具有足够凭据的fetch-outputs
任务,您可以随时下载所有有用的信息。 (该任务会告诉您堆栈是否还没有准备好。)
create-site
任务完成后,您应该在当前工作目录中找到一个文件: my-app-com.confetti.edn
。它的内容应包含有关新配置的资源的所有重要信息:
{ :stack-id " arn:aws:cloudformation:us-east-1:297681564547:stack/my-app-com/xxx " ,
:bucket-name " my-app-com-sitebucket-3fu0w0729ndk " ,
:cloudfront-id " E3760XUWU2V9R7 " ,
:cloudfront-url " d3up0oy7r2svli.cloudfront.net " ,
:access-key " AAA " ,
:secret-key " BBB " ,
:website-url " http://my-app.com " ,
:hosted-zone-id " Z3KJWNUJTT8GHO " }
现在一切准备就绪,可以进行第一次部署了!
现在sync-bucket
任务开始发挥作用。虽然该任务提供了许多不同的方法来指定要上传的内容,但我们仅在此展示最简单的方法:同步本地目录。为了我们的演示目的,让我们快速创建一个目录:
mkdir my-app-site
echo "Hello World" > my-app-site/index.html
echo "About Us" > my-app-site/about.html
现在让我们同步它。从.confetti.edn文件中获取bucket-name
、 access-key
和secret-key
值:
boot -d confetti sync-bucket --bucket "my-app-com-sitebucket-3fu0w0729ndk"
--access-key AAA --secret-key BBB --dir my-app-site
;; or alternatively
boot -d confetti sync-bucket --confetti-edn your-site.confetti.edn --dir my-app-site
这会将index.html
和about.html
上传到您的存储桶。要验证一切是否成功,您可以导航到 edn 文件中存储为cloudfront-url
URL。
还有很多方法可以指定要上传的文件(如果需要,可以使用自定义元数据),本指南未涵盖这些方法。有关详细信息,请参阅
boot sync-bucket --help
。
现在唯一缺少的步骤是正确设置 DNS。此处需要执行的操作取决于您是否启用了--dns
选项。在上面的示例中,我们启用了它,所以让我们首先介绍这种情况:
使用 Route53 的 DNS:因为您有根/裸/顶点域设置,所以您决定使用 AWS 托管的 DNS。现在您需要将您使用的域的名称服务器设置为 AWS 的名称服务器。这些对于不同的托管区域是不同的,因此您需要在 AWS 控制台中查找它们。
不使用 Route53:不使用 Route53 时,您唯一需要做的就是将 CNAME 条目添加到指向 Cloudfront 发行版的域的 Zonefile 中。
这两个步骤因域名注册商而异,因此建议检查其各自的文档。
想要 SSL 吗?以下是启用它的方法。
假设您使用 Confetti 创建了一个站点weloveparens.com
,现在想要将一个静态站点添加到该域的子域中。你可以运行:
boot create-site --domain "shop.weloveparens.com" --dns --access-key FOO --secret-key BAR
这将在 HostedZone 中创建一个 Route53 记录集,该记录集是之前在设置weloveparens.com
时为您创建的。 S3 存储桶、CloudFront 分配等将照常创建。此外,与往常一样,所有内容(包括 RecordSet)都将创建为 CloudFormation 堆栈,因此如果您不再需要它,您可以删除该堆栈,而weloveparens.com
不受影响。
要获取命令行帮助,您可以随时运行:
boot create-site --help
boot fetch-outputs --help
boot sync-bucket --help
也可以随意打开问题来提出问题或提出改进建议。
将您的 AWS 密钥提供给某个程序并让它运行有点令人恐惧,因此本节旨在对此提供一些安慰。
create-site
任务将根据confetti-clj/cloudformation 中定义的模板创建CloudFormation 堆栈。--dry-run
参数。create-site
凭据必须有权创建 CloudFormation 模板中列出的各个资源。 (将来 Confetti 可能会提供 AWS IAM 策略片段,以便您可以创建拥有 Confetti 所需的所有权限的用户。)从版本0.2.0
开始, create-site
命令将创建一个以.confetti.edn
结尾的文件,其中包含维护站点所需的所有信息。该文件中的信息包含秘密!
更新:我得出的结论是创建此文件是一个坏主意。人们不可避免地会提交它并公开其 S3 存储桶的密钥。将来我想以 direnv 可以理解的格式打印一些内容,并推荐使用 env vars / direnv 代替。
[confetti/cloudformation "0.1.6"]
,带来以下改进:confetti/s3-deploy
以提高 Windows 兼容性HostedZone 重用:为每个站点创建新的 HostedZone 有两个缺点:
通过为您的根域example.com
使用一个 HostedZone,这些问题就得到了解决,并且在demo.example.com
添加新站点只需添加一个 RecordSet 即可。 Confetti 现在尝试查找现有的 HostedZone,并且仅在找到时添加 RecordSet。
sync-bucket
任务的新invalidation-paths
选项。以前失效路径是根据您上传的文件确定的。现在您可以提供自定义集。 (#21 + #29)
使用通过.confetti.edn
文件提供选项的新方法修复错误
confetti-edn
选项时,我们现在接受两个版本(以.confetti.edn
结尾以及之前的部分)。以前预计您只提供.confetti.edn
后缀之前的部分confetti-edn
选项和fetch-outputs
任务create-site
调用的单独任务fetch-outputs
任务[confetti/cloudformation "0.1.3"]
以在堆栈输出中包含:website-url
,无论是否使用 Route53fetch-outputs
中打印 Cloudfront URL fetch-outputs
任务,可用于下载 Cloudformation 堆栈的输出。以前,报告经常卡住并且无法正确保存堆栈输出。为了避免这种情况,您现在可以取消报告并在以后的任何时间点调用fetch-outputs
以下载输出。sync-bucket
任务现在提供一个confetti-edn
选项,可用于提供{some-id}.confetti.edn
的 some-id 部分。该文件中的信息将用于代替常规任务选项。如果有任何内容未按预期工作,请提出问题。 ?
注意如果您在从 Cloudfront 分配请求资产时最终收到 504 错误,请仔细检查您是否确实使用网站端点作为源。由于使用网站端点,源协议策略必须是“仅 HTTP”。
Cloudfront 支持 APEX 域,但前提是您使用 Route53 的ALIAS
记录。更多信息可以在官方公告中找到。
此限制使得自动根 (APEX) 域设置变得更加困难,因此当前不支持在不使用 Route53 管理 DNS 的情况下为根域创建站点。